1、基本数据类型
1.1 基本数据类型
byte、chart、short、int、long、float、double、boolean 共8种数据类型为基本数据类型:
数据类型 | 位数 | 取值范围 |
byte | 8 | -128 ~ 127 |
char | 16 | 'u0000' ~ 'uFFFF' |
short | 16 | -2^15 ~ 2^15-1 |
int | 32 | -2^31 ~ 2^31-1 |
long | 64 | -2^63 ~ 2^63-1 |
float | 32 | 略 |
double | 64 | 略 |
boolean | 1 | true / false |
另外,Java中的整数从形式表现上来说有四种方式,除了最常见的十进制,还有:
- 八进制,逢八进一,用0开头
- 十六进制,逢十六进一,0x开头,0-9,A,B,C,D,E,F
- 二进制,逢二进一,任何数据在计算机都是二进制存储,八个二进制代表一个字节byte
另外要提的是,float和double是浮点数类型,即带小数位的数据类型,其数据存储方式是按 “指数位” 和 “有效数字位”,所以尽管double位数和long都是64位,但是double表示的数字范围更广,但同时,也因为这种方式,其数字精度并不准确。(float数据必须带"f"或"F"以和double区分)
float:1bit(符号位) + 8bits(指数位) + 23bits(尾数位)
double:1bit(符号位) + 11bits(指数位) + 52bits(尾数位)
1.2 类型转换
1.2.1 自动类型转换
- 两种类型必须兼容(如boolean无法转int),且目标类型大于源类型(即低精度转高精度)
- 对于表达式而言,最终结果与表达式中最高的数据类型相同
- 类型转换自动发生,无需显式说明
char ch = 'A';
int num = ch;
float f = num;
double d = f;
4
1
char ch = 'A';
2
int num = ch;
3
float f = num;
4
double d = f;
1.2.2 强制类型转换
强制进行类型转换,如果被转换的值的数据类型大于其目标类型,将会丢失部分信息。因为强制转换会进行位数截取,如:
short a = 128;
byte b = (byte) a;
System.out.println(a); //128
System.out.println(b); //-128
4
1
short a = 128;
2
byte b = (byte) a;
3
System.out.println(a); //128
4
System.out.println(b); //-128
short a = 0000 0000 1000 0000,强制转换截取后8位,正数用源码表示,负数用补码表示,第一位为符号位,所以转换后的a,即b,反而变成了-128
除非万不得已,或者绝对确定,否则尽量不使用强制转换。
2、引用数据类型
除了上述的基本数据类型以外,其他都归属于引用数据类型。其实说人话就是,引用数据类型就是对象。
不论是String、int[]、还是自定义的类,都是引用数据类型。
不同的在于,基本数据类型之间的赋值,是对值进行了拷贝;而引用数据类型之间的赋值,是虚地址之间的拷贝。
一个示例说明:
public class Test {
//属性
int a = 11;
char[] ch = {'n', 'b'};
//方法
public void change(int a,char ch[]) {
a = 99;
ch[0] = 's';
}
//测试
public static void main(String args[]) {
Test test = new Test();
test.change(test.a, test.ch);
System.out.println("test.a = " + test.a);
System.out.println("test.ch = " + test.ch[0] + test.ch[1]);
}
}
//对于基本数据类型,拷贝过去对原来的属性没有影响,最终还是11;
//对于引用数据类型,传递的是虚地址,在方法中远程更改了真正的对象,所以输出不是nb,而是sb
x
1
public class Test {
2
//属性
3
int a = 11;
4
char[] ch = {'n', 'b'};
5
//方法
6
public void change(int a,char ch[]) {
7
a = 99;
8
ch[0] = 's';
9
}
10
//测试
11
public static void main(String args[]) {
12
Test test = new Test();
13
test.change(test.a, test.ch);
14
System.out.println("test.a = " + test.a);
15
System.out.println("test.ch = " + test.ch[0] + test.ch[1]);
16
}
17
}
18
19
//对于基本数据类型,拷贝过去对原来的属性没有影响,最终还是11;
20
//对于引用数据类型,传递的是虚地址,在方法中远程更改了真正的对象,所以输出不是nb,而是sb
最后要提一点的就是,对于基本数据类型之间是否相等,我们使用 “==” 的方式,实际是判断其二进制是否相同;而该方式用来判断引用数据类型,则是对比虚地址,我们知道对象和对象之间都是不同的,所以除非是同一个对象否则该方式只会返回给你false,所以对象之间的比较我们更多的是根据需要重写equals方法。