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 }