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 }

 

 

posted @ 2019-02-25 10:58  Estary  阅读(464)  评论(0编辑  收藏  举报