java基本数据类型及类型转换

来源:互联网 发布:手机淘宝评价管理截图 编辑:程序博客网 时间:2024/05/18 03:33

一、八大基本数据类型

特别注意:java中,整数常量(字面量)默认为int类型,浮点数常量(字面量)为double类型

二、八大基本数据类型的数值在内存中的存放形式

1.内存直接存储基本数据类型的值;

2.对于不同的数据类型,内存中分自动分配相应的大小去存储。

这里的大小,由两个条件共同决定:

(1)位数

(2)取值范围

一般来说,我们称位数小且范围小的的类型为低级类型,反之为高级类型。

(ps: 布尔类型boolean 比较特殊,单独说明)

三、基本数据类型的两种转换

类型转换的规则:低级类型可以自动转换为高级类型,高级类型不可以自动转换为低级类型(编译报错)。

类型转换的原理:基本数据类型数值在内存中存放是根据大小分配的。所以,内存小的可以往内存大的放;而内存大的往内存小的放的时候放不进去,所以会出现编译错误。

此时,若要通过编译,需要进行类型强制转换,而强制转换可能会丢失精度(高级类型的真实大小比低级类型的大时,要塞得进就必须舍弃掉一部分体积)。

1.自动转换/隐式转换/自动提升

(1)一般情况下:低级类型会自动提升到高级类型。也就是:低级类型的数值/变量 可以直接赋给 高级类型的变量

public static void main(String[] args) {//=号左边的低级类型可以直接转换为=号右边的高级类型byte b = 1;short s = b; int i = s;long l = i;float f = l;double d = f;//虽然char的位数为16位,但是它的取值范围为0~2^16-1。//而byte类型的取值范围是-2^7~2^7-1,并不在char的取值范围区间内,所以,byte类型不能自动转换为char类型,否则编译报错//char c = b;   //编译报错:Type mismatch: cannot convert from byte to char //同理,short和char之间因为取值范围区间不存在谁属于谁,所以也不能相互自动转换//char c = s;char c = 'c';//s = c;  //编译报错:Type mismatch: cannot convert from byte to char//char的取值范围区间在int、long、float、double取值范围内,故可以自动转换i = c;l = c;f = c;d = c;}
(2)特殊情况1:只针对字面量(常量),字面量是可以在一定的取值范围内赋给低级类型的。

我们知道,整型的字面量默认是int类型。那么,下列表达式会报错吗?

                byte b  = 1;
答案是不会。

虽然1是int类型,属于高级类型。但此时它的值只是1,而byte类型的取值范围是-2^7~2^7-1。1在byte的取值范围区间内,也就是byte类型的变量可以装得下这个int类型的值,所以编译可以通过。(ps:只争对字面量才存在这种情况,其它任何高级类型转换为低级类型,不管值是不是在低级类型的区间内,都必须强制转换)

public static void main(String[] args) {byte b1 = 127; //编译通过byte b2 = 128; //编译报错,128已经超出byte的取值范围,byte装不下,所以编译报错!//其他类型同理short s1 = 10000; //编译通过short s2 = 100000; //编译报错}

(3)特殊情况2:  只针对字面量(常量),字面量不一定可以转换为高级类型,因为自己本身有一定的取值范围。

                long l1 = 1000000000;  //编译通过long l2 = 10000000000; //编译报错:The literal 10000000000 of type int is out of range

因为int类型的取值范围是-2^31~2^31-1 ,l1的字面量数值在此区间内,故编译通过;l2的字面量的数值超出了int的取值范围,编译报错。

要通过编译,只需要把数值声明为long类型即可:

               long l2 = 10000000000L; //编译通过

2.类型强制转换

应用场景:高级类型转换为低级类型时。

强制转换即人为通过声明的方式进行类型转换。

副作用:类型强制转换可能会丢失精度

1.当转换的高级类型数值大小仍在低级类型取值范围内,则不会丢失精度;

2.如果超出了低级类型的取值范围,则会出现“奇怪”的结果(装不进去的位数会被舍弃)。

public static void main(String[] args) {byte b = 1;short s = 1;b = s; //编译报错:Type mismatch: cannot convert from short to byteb = (byte) s ; //编译通过//类型强制转换的声明格式: 低级类型变量 =(低级类型) 高级类型变量}
丢失精度的情况:
public static void main(String[] args) {byte b = 1;short s = 128;  b = (byte) s ; //编译通过System.out.println(b);  //结果: s = -128}
byte 的取值范围时-128~127 , 当把值为128的short类型强制转换成byte类型时,超出了byte的取值范围,即溢出,会截取到存放不进去的高位,所以结果不是我们预想的数值。

四、类型转换在java运算中的应用

当进行数学运算时,数据类型会自动发生提升到类型较大者。

最后的运算结果赋值给指定的数值类型时,如果高于要赋值的变量类型时,需要进行强制类型转换。

比如:位数小于int的其他类型变量与常量进行数学运算后,运算结果会被自动转换成int类型。

    public static void main(String[] args) {                short s1 = 1;        s1 = s1 + 1; //编译报错,s1+1的结果的类型是int类型                //解决方案一:改变变量的类型,使其与结果类型匹配        int result = s1 +1; //类型自动转换                //解决方案二:改变结果的类型,使其与变量类型匹配        s1 = (short) (s1 + 1);//类型强制转换            }
特别注意:+= 、 -= 、 *= 、 /= 等java语法规定的运算符,java编译器自己会进行转换特殊处理,可编译通过,不需要手动强制转换。

public static void main(String[] args) {short s2 = 1;s2 += 1;     //编译通过  //获取此时的s2的数据类型Object object = s2;System.out.println(object.getClass().toString());  //输出的结果是: class java.lang.Short  }
小结:

普通运算表达式 s = s + x 与 java语法规定的运算表达式 s += x ;的异同:

1.相同点:s += x 形式上等同于 s = s + x

2.不同点:s += x 此类语法的表达式,编译器会自己进行类型强制转换,即把结果的类型强制转换为变量s的类型。

                 s = s + x 此类常规表达式,如果 x 的类型 比 s 的类型高级,则需要进行显式的类型强制转换,否则无法通过编译。

五、与java基础数据类型有关的易错知识点

1、s = s + 1; 会编译报错; s += 1; 能编译通过。

2、char类型能储存一个中文的汉字,但是不能存储没有包含在Unicode编码字符集中的汉字。

3、java中 int 和 Integer 的区别:

(1)int 是基本数据类型,Integer 是int的封装类(也叫包装类型);

(2)int 变量的默认值为0,Integer 变量的默认值为null,所以Integer可以区分出0和null的区别;

(3)Integer类内部提供了一些关于整数操作的方法,比如valueOf(String str)、parseInt(String str)、max(int a,int b)...

4、java的switch可以作用在类型小于等于int类型的变量。

(1)由于long的存储范围比int类型大,如果不对long变量进行类型强制转换,那么long类型不能作用于switch上;

(2)String类型在java 1.7版本之前不可以作用于switch, 在java 1.7版本之后是可以的。

5、java中 3*0.1 == 0.3 返回的是false。因为浮点数不能完全精确的表示出来,一般都会损失精度。

6、float类型的数值一定要在后面加f或者F进行声明,否则编译报错(小数默认是double双精度类型)。比如:float f = 1.5f;

原创粉丝点击