基本类型
包括int整型、float浮点型、已经boolean布尔值,整型包括byte(8bit)、short(16bit)、int(32bit)、long(64bit)、char(16bit)。
byte
byte作为文件读写、网络数据传递最常用的数据格式,用于节省内存空间。byte取值范围为[-128, 127]。
字面值计算 byte+byte 会自动升级结果为int,假如计算中出现double、float也会自动升级(顺序为 byte short int long float double)..
一个有趣的问题,如果我们有个方法: public void test(byte b)。试图这么调用这个方法是错误的: test(0); 编译器会报错,类型不兼容!!!因为test(0)匹配的方法是public void test(int b)而不是public void test(byte b),因为0在字面值上是int类型的,而不会直接赋值.
byte d = 'A';也是合法的,字符字面值可以自动转换成16位的整数。
short
最不常用的类型,取值范围为[- 2^15, 2^15 - 1],与byte一样,字面值计算时,会升级为int类型。
int
取值范围[- 2^31, 2^31 - 1],java 8 后,可以用int类型表示 2^32 位值。
long
64 bits, [- 2^63, 2^63 - 1,默认值为0L].当需要计算非常大的数时,如果int不足以容纳大小,可以使用long类型。如果long也不够,可以使用BigInteger类。
char
16bit,[0, 65535], [0, 2^16 -1],从'\u0000'到'\uffff'。无符号,默认值为'\u0000'。
char 型变量是用来存储 Unicode 编码的字符的, unicode 编码字符集中包含了汉字,所以,
char 型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在 unicode 编
码字符集中,那么,这个 char 型变量中就不能存储这个特殊汉字。 补充说明: unicode 编
码占用两个字节,所以, char 类型的变量也是占用两个字节。float
32bit,使用32 bit表示,对应单精度浮点数,运行速度相比double更快,占内存更小,但是当数值非常大或者非常小的时候会变得不精确
double
64为表示,将浮点子面子赋给某个变量时,如果不显示在字面值后面加f或者F,则默认为double类型。java.lang.Math中的函数都采用double类型。
如果double和float都无法达到想要的精度,可以使用BigDecimal类
boolean 布尔值
引用类型
引用类型(reference type ) 指向对象的变量。
在java里,除了基本类型,其他类型都属于引用类型,自己定义的class类实例化后也就是一个引用类型。如A a = new A(); a就是一个引用类型的变量.
引用类型赋值
引用类型的赋值与基本类型有所不同,如
int x= 10;
int y = x;
这时,因为x/y属于基本类型变量,所以x.y拥有独立的变量(基本类型字面值出于读取速度考虑,会将字面值直接放在栈中)。
String h = "hello";
String z = h ;
h,z指向同一对象。这时,若h="world",则会新创建一个"world"对象,并h指向新建的这个对象。z还是指向“hello”对象。
按值传递和按引用传递的区别
按值传递
即对元数据进行一份拷贝,拷贝数据的变化与元数据无关。如:
public test(int a){ a++;System.out.println(a);}
public static void main(String args[]){
int a = 10;
test(a);
System.out.println(a);
}
main输出的结果是 10;
test输出结果为11;
按引用传递
即传递变量的引用地址,若地址指向的变量改变,指向同一内存空间的变量同步改变。
在Java里面只有基本类型和按照下面这种定义方式的String是按值传递,其它的都是按引用传递。就是直接使用双引号定义的字符串方式:String str = "Java";