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

本文探讨了Java中成员变量的初始化过程和内存管理,包括类变量与实例变量的区别。在类加载时,系统为类变量分配内存并赋予默认值,而实例变量在对象创建时分配内存。同时,建议在访问类变量时使用类本身而非对象,以提高代码可读性和避免混淆。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

成员变量是自动赋值,但是,局部变量而言,不会赋初始值,必须要手动给它赋初始值,不然会造成空指针异常
 
 

public class Person{
    String name;
    static int eyeNum;

    public static void main(String[] args) {

        Person pl = new Person( );
        Person p2 = new Person() ;

        pl.name = "张三";
        p2.name = "悟空";

        pl.eyeNum = 2 ;
        System.out.println(pl.name+pl.eyeNum);
        p2.eyeNum = 3 ;
        System.out.println(pl.name+pl.eyeNum);//因为访问的是同一块类实例,所以当一个对象修改后,另外一个对象再来访问,访问的就是修改后的类实例
        System.out.println(p2.name+p2.eyeNum);
    }
}

 
 

张三2
张三3
悟空3

Process finished with exit code 0

 
 

当执行Person pl = new Person( ); 时候,因为是第一次使用Person类,所以会在第一次使用时候,加载这个Person类,并初始化它

在类的准备阶段,系统为该类的类变量分配内存空间,并指定默认的初始值

 
 

在这里插入图片描述

 
 
当Person类初始化完成后,系统在堆内存为Person类分配一块内存空间

当Person类初始化完成后,系统会为Person类创建一个类对象

这块内存空间保存了eyeNum类变量的内存,并且给它设置赋初始值0

接着

系统创建了Person对象,把Person对象赋值给了p1变量

Person对象包含了name实例,实例变量是在创建实例时候分配内存空间并指定初始值的
 
 

在这里插入图片描述

 
 
eyeNum 类变量并不属于 Person 对象 它是属于 Person类的,所以创建第

一个Person 对象时并不需要为 eyeNum 类变量分配内存,系统只是为 name实例变量分配了 内存空间,并指定默认初始值 null

接着执行 Person p2 = new Person() 代码创建第二个 Person 对象,此时因为 Person 类己经存在于堆内存中了,所以不再需要对 Person 类进行初始化

 
创建第二个 Person 对象 与创建第一 Person 对象并没有什么不同

执行 p1. epyeNum = 2; 代码时,此时通过 Peron 对象来修改 Person 的类变量

Person 对象根本没有保存 eyeNum 这个变量,通过 pl 问的 eyeNum 类变量

其实还是 Person类的 eyeNum 类变量,因此,此时修改的是 erson 类的 eyeNum 类变量
 
 

在这里插入图片描述

 
 

在这里插入图片描述

 
 
换句话来说 通过哪个 Person实例来访问 eyeNum 类变量 ,本质其实还

是通过 Person类来访问 eyeNum 类变量时,它们所访问的是同 一块内存。基于这个理由,建议

当程序需要访问类变量时,尽量使用类作为主调,而不要使用对象作为主调,这样可以避免程序产生歧义,提高程 的可读性

是通过 Person类来访问 eyeNum 类变量时,它们所访问的是同 一块内存。基于这个理由,建议
 
 
当程序需要访问类变量时,尽量使用类作为主调,而不要使用对象作为主调,这样可以避免程序产生歧义,提高程 的可读性
 
 

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值