JAVA 的成员变量和局部变量 以及初始化和内存运行机制

java的变量包括成员变量和局部变量

1、成员变量和局部变量的简单概念

成员变量:

  • 实例变量(不以static修饰)
  • 类变量(以static修饰)

局部变量:

  • 形参(方法签名中的变量)
  • 方法局部变量(在方法内定义)
  • 代码块局部变量(在代码块中定义)

成员变量

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

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

正是基于这个原因,可以把类变量和实例变量统称为成员变量。其中类变量可以理解为类成员变量,它作为类本身的一个成员,与类本身共存亡;实例变量则可以理解为实例成员变量,它作为实例的一个成员与实例共存亡。

只要类存在,类就可以访问类变量 类.类变量

只要实例存在,实例就可以访问实例变量 实例.实例变量

当然实例也可以访问类变量。但是需要注意的是因为实例不拥有类变量,所以通过实例来访问类变量进行操作,实际上是对类变量进行操作 ,当有其他实例来访问类变量时,访问的类变量是被对象访问操作过的类变量。

成员变量无需显示初始化,只要为一个类定义了类变量或实例变量,系统就会在这个类的准备阶段或创建该类的实例时进行默认初始化。

局部变量

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

形参:在定义方法签名时定义的变量,形参的作用域在整个方法中都有效

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

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

一个变量只在一对{}中起作用。

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

java允许局部变量和成员变量同名,如果方法中局部变量和成员变量同名,局部变量就会覆盖成员变量,如果需要在这个方法中引用被覆盖成员变量,则可使用this(对于实例变量)或类名(对于类变量)作为调用者来限定访问成员变量。

> 1 public class Animal {
> 2     public String name;
> 3     public int age ;
> 4     
> 5     public static void main(String[] args) {
> 6         Animal a1 = new Animal();
> 7         Animal a2 = new Animal();
> 8         a1.name = "大黄";
> 9         a2.name = "大白";
>10         a1.age = 2;
>11         a2.age = 3;
>12     }
>13     
>14 }
>15

当程序执行Animal a1 = new Animal ();时,如果这行代码是第一次使用Animal 类,则系统通常会在第一次使用Animal 类时加载这个类,并初始化这个类,在类的准备阶段,系统将会为该类的类变量分配内存空间,并指定默认初始值。当animal类初始化完成后,系统内存中的存储示意图如下图所示。

在这里插入图片描述

从上图可以看出name不属于对象,它属于类,所以创建第一个对象时并不需要为name分配内存空间,系统只是为name分配了内存空间,并指定初始值为null。

创建第二个对象a2时,由于在创建第一个对象时已经对类进行了初始化,所以在创建a2时对类进行初始化,对象的创建过程与第一个对象的创建过程没有什么区别。

在这里插入图片描述

第二个对象创建完成后,成员变量如上图所示在内存中存储。

当程序需要访问类变量时,尽量使用类来作为主调,不要使用对象作为主调,这个可以避免产生歧义。

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

局部变量必须经过显示初始化之后才能使用,系统不会为局部变量执行初始化。定义了局部变量以后,系统并没有给局部变量进行初始化,直到程序给这个局部变量赋给初值时,系统才会为这个局部变量分配内存空间,并将初始值保存到这块内存中。

局部变量不属于任何类或者实例,因此它总是保存在方法的栈内存中。如果局部变量是基本数据类型,则该变量直接存储在方法的栈内存中,如果是引用变量则将引用的地址存储在方法的栈内存中。

栈内存中的变量无需系统垃圾回收,随着方法或者代码块的运行结束而结束。局部变量通常只保存了具体的值或者引用地址,所以所占的内存比较小。

4、变量的使用规则

能不使用成员变量就别使用成员变量

能不使用方法局部变量就别使用方法局部变量

使用代码块局部变量性能最好。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值