JAVA数据类型和数据类型自动提升的注意事项
1 /* 数据类型 2019-2-24 2 * 数值型:整数型: 3 * byte; 1字节 -128~127 4 * short; 2字节 约正负3.2W 5 * int; 4字节 约正负21亿,刚好10位数字; JAVA默认数值为int类型 6 * long; 8字节 天文数字;末尾加L 7 * 数值型:浮点型 8 * float 4字节 末尾加f 9 * double 8字节 末尾加d, JAVA默认为双精度double类型 10 * 布尔型 11 * true 1字节 12 * false 1字节 13 * 字符型 14 * char ASCII:0~65535 故也可划分为数值型 15 * string 16 * 17 * 定义变量固定格式:数据类型 变量名 = 初始化值 18 * 19 * 隐式类型转换: 20 * JVM在编译过程中,对于默认为int类型的常值,当赋给一个比int型数值范围小的数值类型变量时(在此统一称为数值类型k, 21 * k可以是byte/char/short类型),会进行判断,如果此int类型的数值超过k类型的数值范围,那么会直接编译出 22 * 错;但是如果此int型数值尚在类型k的数值范围内,则JVM会自动进行一次隐式类型转换,将此int类型数值转换成k类 23 * 型,而不需要我们手动强制类型转换 24 * 25 * 显式强制类型转换: 26 * JVM在编译过程中,将【数值范围较大】的数值类型赋给【数值范围较小】的数值类型变量时,需要手动转换,小数默认为double,整数默认为int 27 * 28 * 数据自动提升: 29 * 当将一个【数值范围较小】的类型赋给一个【数值范围较大】的数值型变量时,jvm在编译过程中均将此数值的类型进行了自动提升 30 * 顺序:byte->short->int->long->float->double 31 * 32 * 在四则运算中(加减乘除): 33 * 1.如果两个操作数其中有一个是double类型,另一个操作就会转换为double类型。 34 * 2.否则,如果其中一个操作数是float类型,另一个将会转换为float类型。 35 * 3.否则,如果其中一个操作数是long类型,另一个会转换为long类型。 36 * 4.否则,两个操作数都转换为int类型 37 * 即四则运算的转换顺序为:double -> float -> long -> int 38 * 6.三元运算符的结果的数据类型提升为两者之间较大的数据类型 39 * 7.自加不会提升数据类型 40 * 41 * 赋值与自动提升: 42 * 1.左边是低级数据类型,右边如果是非常量(有变量),则不会进行自动转换。如:byte a = a + 3 ; int a = a + 1L; 1是long型 43 * 44 *---------------------------------------------------------------------------------------------------- 45 *总结: 46 * 1.赋值:将常量赋值给变量时,先自判值范围是否溢出(默认int/double),再判断赋值是否需要转换类型, 47 * 大转小需强制转换,小转大自动提升; 48 * 特殊:默认值为int:赋小自判后隐式自转,赋大自提 49 * 2.四则运算有大算大,无大自转为int;有变量参与的运算结果不能隐式转换 50 * 3.三运运算自提为升为两者之间较大的数据类型; 51 * 4.自增/自减不会改变类型 52 *---------------------------------------------------------------------------------------------------- 53 * */ 54 package day001; 55 56 public class A01_数据类型 { //类名首字母大写; 不能以数字开头; 可以$或者_开头 57 public static void main(String[] args){ 58 59 //隐式自动转换:默认为int赋值给比int小的类型,会自动判断 60 byte a = 6; 61 short b = 32000; 62 int c = 1234567890; 63 64 //显式强制转换:类型由大转小,需手动转换。小数默认为double,整数默认为int 65 long d1 = 1234567890; //默认左边为int,赋值给long,数据类型自动提升 66 // long d = 123456789000; //默认左边为int类型,123456789000已经超过int取值范围,所以报错,需在后面加L表示该数值是Long类型 67 long d = 123456789000L; 68 //float e1 = 2.3; //默认左边为double,需强制转换后才可以赋值给float 69 float e = 2.3F; 70 char f = 97; //此时输出结果是:a,因为此时char的ASCII码97对应a,此时java会认为左边的97是ASCII吗 71 char g = 'a'; //正确写法,应该加上单引号。 72 System.out.println("f:" + f); //输出a 73 System.out.println("g:" + g); //输出a 74 75 76 //四则运算,有大转大,无大转int,运算结果不能隐式转换 77 short x1 = 10; 78 short x2 = 20; 79 //下面编译错误,x3定义为short,x1和x2会自动提升为int类型 80 //short x3; 81 //x3=x1+x2; 82 83 short s1 = 1; 84 //s1 = s1 + 1; //错误,四则运算有大为大,无大为int,运算结果为int,不能隐式转为short 85 86 //自增的数据类型 87 short s2 = 1; 88 //下面的表达式的实际过程是:short s2 = (short)(s2+1); 89 s2 += 1; 90 91 //三元运算符自动提升: 92 int q = 10; 93 //下面的三元运算符,目测运算结果是9,可是输出结果是9.0 94 //原因是计算后的结果的数据类型提升为两者之间较大的数据类型,9.9f是float类型 95 float aa = q > 10 ? 9.9f : 9; 96 System.out.println("aa=" + aa); 97 98 } 99 }