成员变量被分为静态变量和实例变量两种,简单来说,定义成员变量时没有 static 修饰符的就是实例变量,反之,有static修饰符的就是静态变量,在构造方法执行时,成员变量被赋值。
而什么是局部变量呢?局部变量就是在一个方法内或一个代码块内有效的变量,出了这个方法或代码块就失效了的变量。
接下来谈谈具体的。
- 什么时候成员变量声明为实例变量?
- 所有对象都有这个属性,但是这个属性会随着对象的变化而变化
—————————————————————————— - 什么时候成员变量声明为静态变量?
- 所有对象都有这个属性,但是这个属性不随着对象的变化而变化
同时,静态变量是在类加载的时候初始化,不需要创建对象,内存就在方法区内被开辟了,方法区内主要存储已被虚拟机加载的类信息、常量、静态变量。静态变量通过“类名.”的方式访问,虽然也可以通过“引用.”的方式访问,但当引用是个空指针时依旧可以访问,因为访问静态变量与引用压根没关系。
其中, 静态变量从该类的准备阶段起开始存在,直到系统完全销毁这个类,类变量的作用域与这个类的生存范围相同;而实例变量则从该类的实例被创建起开始存在,知道系统完全销毁这个实例,实例变量的作用域与对应实例的生存范围相同。
当然,对于成员变量来说,如果没有手动赋值,系统会自动分配默认值。这里列举各类型的默认值如下。
byte、short、int、long------>0
float、double------>0
boolean------>false
char------>‘\u0000’(空字符)
String、引用数据类型------>null
String是Java写好的一个类型,也是在堆中存储的,不用new也会创建出对象。
顺便提一下内存存储机制,局部变量是存储在栈中的,而这个局部变量如果是基本数据类型,就不必再多说了,如果是引用数据类型,那么栈中存储的就是在堆内存中开辟的实例的地址,用C++的话来说就像是指针嘛。而对于实例而言,他的实例变量存储在他所对应的这个堆内存之中。