从三个角度来分析这个问题
存储的类型
默认值
生命周期
存储类型
1、堆上存储的是new出来的东西,是引用数据类型的实质——对象
栈上存储的是局部变量(基本数据类型和引用类型的引用)
默认值
堆上对象中的变量具有默认值:
整形(byte、short、int、long)默认值为0
浮点类型(float、double)默认值为0.0
字符类型(char)默认值是'\u0000' 表示编码值为0的字符,一个绝对空字符。
布尔类型(boolean)默认值是false
引用数据类型默认值是null
null既不是对象也不是任何一种数据类型,它仅是一个特殊的值
任何引用数据类型的引用都可以指向null,指向null并不意味着没有初始化,可以认为引用指向了虚无,反正没有指向任何一个对象。
对象才是引用数据类型的实质,没有指向对象的引用实际上没有任何意义,指向null的引用是无法正常使用的!
基本数据类型不能等于null
栈上的局部变量没有默认值,声明局部变量后必须显式的初始化,否则无法使用。
生命周期
1. 堆上的对象使用完毕后,随着方法的出栈,对象的引用就会被销毁。这个时候对象就没有引用指向它,而是"孤零零"的单独存在于堆上,这种对象意味着我们就无法再次使用它了,这种对象没有意义了。在Java中,我们把这种对象称之为`垃圾`或者`垃圾对象`,它们会等待垃圾回收器进行内存回收。
关于Java的垃圾回收机制(Garbage Collection简称GC):
堆上的对象变成`垃圾`后,并不是立刻就会被回收,而是需要GC通过一系列的算法来决定它是否被回收。
Java的GC机制是全自动的,程序员几乎无法干涉和主动回收`垃圾`。这一方面为Java程序员的开发节省了大量的精力(无需花费大量精力来管理堆内存),相比于C++的全手动回收`垃圾对象`,Java在GC机制上的创新是Java能够如此流行的重要原因之一。但另一方面,一旦GC这种机制出现问题,对Java而言将会是非常难以解决的问题。
垃圾回收是Java和C++之间的一道围墙,墙外的人想进来,墙内的人却想出去。
2. 栈上的局部变量的生命周期和栈帧保持一致。方法栈帧进栈后,局部变量开辟空间生效了,方法出栈后,局部变量就被销毁了。