Java基本类型
Java共有8种基本类型,分别为 int long double float char boolean byte short。其中byte int long short是整型,float double是浮点型,char是字符型,boolean是布尔型。
Java引用类型
简单来说除了8种基本类型之外都是引用类型。同时Java还为8种基本类型提供了对应的封装类型。分别为:Integer Long Double Float Character Boolean Byte Short。引用类型是一种对象类型,它的值是指向内存空间的引用,就是地址。
基本类型和引用类型的区别
默认值:
整型byte、short、int、long的默认值都为0,浮点型float、double的默认值为0.0,boolean默认值为false,char默认值为空。引用类型默认值null。(但是我不懂给默认值是干嘛的,不进行初始化的变量也不能使用啊。后续需要研究一下)
内存分配
基本数据类型的变量是存储在栈内存中,而引用类型变量存储在栈内存中,保存的是实际对象在堆内存中的地址。
什么是引用
简单来说,引用就是一个对象的别名。一个对象会在内存中请求一块空间存储数据,我们访问该对象时候,不是直接访问这块访问对象在内存中的数据,而是通过引用访问。引用也是数据类型,它指示了对象在内存的地址——只是我们知道引用的值罢了。
如果我们定义了不止一个引用指向同一个对象,那么这些引用是不相同的,因为引用也是一种数据类型,需要一定的内存空间(stack,栈空间)来保存。但是它们的值是相同的,都指示同一个对象在内存(heap,堆空间)的中位置。比如:
通过上面的代码和图形示例不难看出,a 和 b 是不同的两个引用,我们使用了两个定义语句来定义它们。但它们的值是一样的,都指向同一个对象 "This is a Text!"。但要注意String 对象的值本身是不可更改的 (像 b = "World"; b = a; 这种情况不是改变了 "World" 这一对象的值,而是改变了它的引用 b 的值使之指向了另一个 String 对象 a)。
故引用本身也是一种数据类型,保存在栈(stack)中,然后它保存是地址,什么地址呢?是对象在内存中(heap,堆空间)的地址。
上文提到了基本类型对应的封装类型。这里继续研究一下。
自动装箱和自动拆箱
Java从jdk1.5开始引入自动装箱和拆箱,使得基本数据类型与引用类型之间相互转换变得简单。
自动装箱:java自动将原始类型转化为引用类型的过程,自动装箱时编译器会调用valueOf方法,将原始类型转化为对象类型。
自动拆箱:java自动将引用类型转化为原始类型的过程,自动拆箱时编译器会调用intValue(),doubleValue()这类的方法将对象转换成原始类型值。
自动装箱主要发生在两种情况:一种是赋值时,一种是方法调用时。
赋值
Integer a = 3; //自动装箱
int b = a; //自动拆箱
方法调用
public Integer query(Integer a){
return a;
}
query(3); //自动装箱
int result = query(3); //自动拆箱
这其中又有很多问题需要研究,将另开一篇文章来研究。
关于引用类型的讨论远非这么简单。java中到底有没有按引用传递和按值传递的区分?以及4种引用类型(强引用,弱引用,软引用,虚引用)的研究也将另开一篇来学习分享。
才疏学浅之处,切莫在意。
——2019.7.2下午