Java入门第9课——基本数据类型

1.1 8种基本数据类型

1.1.1 8种基本数据类型

    · Java语言有8种基本数据类型,分别用于存储整数、浮点数、字符数据和布尔数据类型。

Java入门第9课——基本数据类型_第1张图片

8种基本数据类型(续1)

    · Java 8种基本类型的存储空间和使用场景如下表所示:

类型名称 字节空间 使用场景
byte 1字节(8位) 存储字节数据(较常用)
short 2字节(16位) 兼容性考虑(很少使用)
int  4字节(32位) 存储普通整数(常用)
long 8字节(64位) 存储长整数(常用)
float 4字节(32位) 存储浮点数(不常用)
double 8字节(64位) 存储双精度浮点数(常用)
char 2字节(16位) 存储一个字符(常用)
boolean 1字节(8位) 存储逻辑(true、false)(常用)

1.2 int类型

1.2.1 int类型

    · int是最常用的整型类型。一个int类型的变量占用4个字节(32位),最大表示范围为:-2^31~2^31-1,即-2147483648~2147483647。

1.2.2 整数直接量是int类型

    · 所谓整数直接量(literal)就是直接写出的整数。

    · 例如:下面的语句中,100就是直接量。

     int a=100;

    · 关于整数直接量,需要注意如下要点:

        整数的直接量的类型默认为int类型,如果直接写出的整数超过了int的表达范围,将会出现编译错误。

        - 除了通常的十进制书写形式,整数直接量也经常写16进制的形式(以0X或0x开头)或8进制的形式(以0开头)。

整数直接量是int类型(续1)

int a=100000;//10进制
int b=0x186a0;//16进制
int c=0303240;//8进制
    
//编译错误,因为整数直接量超过了整数的范围
int d=1000000000;

    10000000000这个数值写出来就是错误的,因为Java认为所有直接写出的整数都是int类型,而这个数值超过了int的表达范围。

1.2.3 整型数据的除法运算中的取整

    · 两个整数相除,会舍弃小数的部分(不是四舍五入),结果也是整数。

int c=5/3;
System.out.println(c);//c的值为1
    
int total=87;
int error=23;
int percent=error/total*100;
System.out.println(percent+"%");
//结果为0%,23除以87整数部分为0
percent=100*error/total;
System.out.println(percent+"%");
//结果为26%,230除以87整数部分为26

1.2.4 运算时要防止溢出的发生

    · 整数运算的溢出:两个整数进行运算时,其结果可能会超过整数的范围而溢出。正数过大而产生的溢出,结果为负数;负数过大而产生的溢出,结果为整数。

int a=2147483647;
int b=-2147483648;
a=a+1;
b=b-1;
System.out.println("a="+a);
System.out.println("b="+b);

    输出结果:a=-2147483648 溢出,错误,b=2147483647 溢出,结果错误

1.3 long类型

1.3.1 long类型

    在表示整数时,如果int类型的范围不够,可以使用long型,一个long型的变量占用8个字节(64位),最大表示范围为:-2^63~2^63-1,即-9223372036854775808~9223372036854775807。

    如果要表示long直接量,需要以L或l结尾。

long a=10000000000;//会有编译错误
long b=10000000000l;

1.3.2 使用long类型进行较大整数的运算

    · 对于较大的整数运算(超过int的表达范围),可以使用long型。

long distance1=10000*365*24*60*60*299792458l;
//必须有一个long型数据参与的运算结果才是long型
System.out.println("distance="+distance1);
//distance1=547836957965889536 结果正确
    
long distance2=10000*24*60*60*299792458;
System.out.println("distance2="+distance2);
//distance2=-1973211136溢出

1.3.3 通过时间毫秒数来存储日期和时间

    · JDK提供System.currentTimeMillis()方法,返回1970年1月1日零点到此时此刻所经历的毫秒数,其数据类型为long,该方法经常用于计时操作。

long time=System.currentTimeMillis();
System.out.println(time);
//输出的结果为:1383835712828

1.4 double类型

1.4.1 使用double进行浮点数的运算

    · 浮点数,就是小数,包括:float和double

    · double类型的精度值是float类型的两倍,这正是其名称(双精度)的由来。

    · 大多数场合使用double表示浮点数。

double pi=3.14;
double r=8;
double s=pi*r*r;
    
System.out.println("s="+s);
//输出的结果为:s=200.96

1.4.2 浮点数直接量是double类型

    · 浮点数的直接量有两种写法:

        通常写法,如3.14、314、0.1、.5。

        科学计数法,如:1.25E2、1.25e2、1.25E-2。其中,1.25E2表示1.25乘以10的2次方。

    · 默认的浮点直接量为double型,如果需要表示float类型的直接量,需要加"f"或"F"后缀。例如

       float f1=3.14会有编译错误,应该写成3.14f

1.4.3 double运算时会出现舍入误差

    · 2进制系统中无法精确的表示1/10,就好像十进制系统中无法精确的表示1/3一样。

    · 所以,2进制表示10进制会有一些舍入误差,对于一些要求精确运算的场合会导致代码的缺陷。

double money=3.0;
double price=2.9;
System.out.println(money-price);
//输出的结果是:0.100000000000009

    如果需要精确的运算可以考虑放弃使用double或float而采用BigDecimal类来实现。关于这一点,将在后续的章节中介绍。

1.5 char类型

1.5.1 char类型

    · 字符类型事实上是一个16位无符号整数,这个值是对应字符的编码

    · Java字符类型采用Unicode字符集编码。Unicode是世界通用的定长字符集,所有的字符都是16位

    · 字符直接量可以采用诸如:'中'的形式,也可以采用16进制的表示形式,例如:'\u4e2d'

char c1='中';//c1中存的是"中"的编码
char c2='\u4e2d';
System.out.println(c1);
System.out.println(c2);

    '4e2d'为'中'所对应16位Unicode编码的16进制表示形式。

1.5.2 对char型变量赋值

    · 在对char型变量赋值时,可以采用如下三种方式:

        字符直接量:形如'A',变量中实际存储的是该字符的Unicode编码(无符号整数值),一个char型变量只能存储一个字符。

        整型直接量:范围在0~65535之间的整数,变量中实际存储的即该整数值,但表示的是该整数值所对应的Unicode字符。

        Unicode形式:形如'\u0041',Unicode字符的16进制形式。

char c1=65;
char c2='A';
char c3='\u0041';

1.5.3 使用转义字符

    · 对于不方便输出的字符采用转义字符表示,例如:

转义字符 含义
'\n' 表示回车符
'\r' 表示换行符
'\\' 表示反斜杠(\)
'\'' 表示单引号(')
'\"' 表示双引号(")
char c='\\';
System.out.println(c);//输出的结果为:\

1.6 boolean类型

1.6.1 使用boolean变量进行关系运算

    · boolean类型适用于逻辑运算,表示某个条件是否成立。一般用于程序的流程控制。

    · boolean类型只允许取值true或false,true表示条件成立而false表示条件不成立。

    · boolean型变量经常用于存储关系运算的结果,所谓关系运算就是比较两个变量的大小相等等关系。

int age=18;
boolean isChild=age<16;//isChild的值为false
System.out.println(isChild);
boolean running=true;
boolean closed=false;

1.7 类型间的转换

1.7.1 基本类型间转换

    · 不同的基本类型直接可以相互转换:

        自动类型转换(隐式类型转换):从小类型到大类型可以自动完成。类型的大小关系如下图所示:

image.png

        强制转换:从大类型到小类型需要强制转换符:

           (需要转换成的类型)变量

             但这样转换有可能会造成精度损失或者溢出。

1.7.2 强制转换时的精度丧失和溢出

    · 基本类型转换示例,注意强制转换时可能会造成的精度丧失和溢出。

int a=100;
int b=200;
long c=a+b;//自动将int转换为long

long l1=1024l;
int i=(int)l1;//需要加强制转换符由于1024在int的范围内没有产生溢出
    
long l=1024L*1024*1024*4;
int j=(int)l;//会产生溢出
System.out.println(j);//结果为:0
    
double pi=3.1415926535897932384
float f=(float)pi;//会造成精度的损失
System.out.println(f);//结果为:3.1415927

1.7.3 数值运算时的自动转换

    · 多种基本类型参与的表达式运算中,运算结果会自动向较大的类型进行转换:

//由于有long型的直接量参与,整个表达式的结果为long
long distance=10000*365*24*60*60*299792458l;
//由于有double型的直接量599.0参与
//整个表达式的结果为double
double change=800-599.0;
    
double persent1=80/100;
//结果为0.0,右边都是int型数据运算结果也是int类型,结果为0,再赋值给double型,将0转换为0.0
    
double persent2=80.0/100;
//结果为0.8,右边表达式有double型直接量参与,运算结果为double型

1.7.4 byte、char、short转换为int

    · byte、char、short三种类型实际存储的数据都是整数,在实际使用中遵循如下规则:

        int直接量可以直接赋值给byte、char和short,只要不超过其表示范围。

        byte、char、short三种类型参与运算时,先一律转换成int类型再进行运算。

关注公众号,获取学习视频

Java入门第9课——基本数据类型_第2张图片

 

你可能感兴趣的:(Java,Java零基础课程)