概述
Java号称一切皆为对象,此话不假,但是尚需知道Java中的对象分两种类型:基本类型和非基本类型。
基本类型
基本类型就是那些最常用的类型,例如:boolean/char/byte/short/int/long/float/double,这些类型有个特点,就是变量直接存储值。举个栗子:int num=100;
,变量num中存储的值就是100。
非基本类型
那啥是非基本类型呢,从字面就可以理解,除了基本类型之外的都是非基本类型了。非基本类型有个显著特点就是初始化的时候一般需要使用new来创建一个对象。
例如:String name=new String("Tom");
。注意因为String字符串类型太常用了,Java为该类型做了一个语法糖:例如String name="Tom"
,可以使用等号简化new操作,但是String类型依然是非基本类型。
非基本类型跟基本类型的本质区别,在于非基本类型变量存储的不是值,而是"引用"。
例如String name=new String("Tom");
,首先有一个字符串"Tom"在内存上一个位置存储好,然后name变量保存的是一个指示该位置的"引用“。注意该引用不一定是一个真实的内存物理地址,也可以是一个物理地址的代号,Java虚拟机只要能通过该引用找到这个位置就好了。
内存的不同位置
实际上,基本类型和非基本类型对象的存储位置也是有区别的,基本类型对象存储于“堆栈”中,而非基本类型对象存储于“堆”中。
大家需要了解的是,“堆栈”更加靠近寄存器,所以速度更快,但是空间也就更小。而“堆“速度稍微慢点,但是空间更大。“堆栈”和“堆”都是内存的一块区域。
还有一点Java是一门语言,具体如何执行还要靠虚拟机实现,所以上述"堆”和"堆栈“说法也不一定100%如此,比如某个大牛非要实现一个虚拟机,让基本类型存储到堆上,也未尝不可…一顿操作猛如虎,这段话只是提供一个假设,目前应该还是按上述逻辑在执行的。