Java基础(四)Java类的成员变量和局部变量

在Java中,成员变量和局部变量存在较大的差异性。首先,我们来看一下变量的分类图:

成员变量

成员变量被分为:类属性和实例属性。

类属性从这个类的准备阶段起开始存在,直到系统完全销毁这个类,类属性的作用域与这个类的生存范围相同;

而实例属性则从这个类的实例被创建开始存在,直到系统完全销毁整个实例,实例属性的作用域与对应实例的生存范围相同。

注意:成员变量无须显式初始化,只要为一个类定义了类属性或实例属性,则系统会在这个类的准备阶段或创建这个类的实例时,进行默认初始化,,成员变量默认初始化时的复制规则与数组动态初始化时数组元素的赋值规则完全相同。

实例属性随实例的存在而存在,而类属性则随类的存在而存在。实例也可以访问类属性,同一个类的所有实例访问类属性时,实际上访问的是同一个类属性,因为它们实际上都是访问到该类的类属性。

局部变量

局部变量根据定义形式不同,又可以被分为如下三种:

方法局部变量:在方法体内定义的局部变量,它的作用域是从定义该变量的地方生肖,到该方法结束时生效;

代码块局部变量:在代码块中定义的局部变量,这个局部变量的作用域从定义该变量的地方生效,到该代码块结束时失效。

与成员变量不同的是,局部变量除了形参之外,都必须显示初始化。也就说,必须先给方法局部变量和代码块局部变量指定初始值,否则不可以访问它们。

成员变量的初始化和内存中的运行机制

当系统加载类或创建该类的实例时,系统自动为成员变量分配内存空间,并在分配内控空间后,自动为成员变量指定初始值。

public class Person {public String name;public static int age;public static void main(String[] args) {//创建第一个Person对象Person p1 = new Person();//创建第二个Person对象Person p2 = new Person();//分别为两个Person对象的name属性赋值p1.name="张三";p2.name = "李四";//分别为两个Person对象的eyeNum属性赋值p1.age = 20;p2.age = 30;}}

(初始化Person类后的示意图)

(创建第一个Person对象后的示意图)

(为第一个Person对象的name属性赋值后的存储示意图)

(设置p1.age的属性后的存储示意图)

局部变量的初始化和内存中的运行机制

局部变量定义后,必须经过显示初始化才能使用,系统不会为局部变量执行初始化。这意味着:

定义局部变量之后,系统并未为这个变量分配内存空间,直到等到程序为这个变量赋初始值时,系统才会为局部变量分配内存,并将初始值保存到这块内存中。

与成员变量不同,局部变量不属于任何类或实例,因此它总是保存在其所在方法的栈内存中的。

如果局部变量是基本类型的变量,则直接把这个变量的值保存在该变量对应的内存中;

栈内存中的变量无须系统垃圾回收,栈内存中的变量往往是随方法或代码块的运行结束而结束的。

因此,局部变量的作用域是从初始化该变量开始,到该方法或该代码块运行完成而结束。因此局部变量只保存基本类型的值或者对象的引用,因此局部变量所占的内存区通常非常小。

PS:成员变量时被放置到堆内存中的,而局部变量放置在栈内存中。

成员变量将被放置到堆内存中,成员变量的作用域扩大到类存在范围或者对象存在范围,有两个害处:

增大了变量的生存时间,这将导致更大的系统开销;扩大了变量的作用域,这不利于提高程序的内聚性。

版权声明:本文为博主原创文章,未经博主允许不得转载。

找回自我,歇够了,再飞回来,继续面对自己的人生。

Java基础(四)Java类的成员变量和局部变量

相关文章:

你感兴趣的文章:

标签云: