java中类和对象的定义及使用(2)-java对象内存图

Java中类和对象与数组一样,在java虚拟机(jvm)运行程序时同样需要对对象的内存进行分配。

2.1:对象内存图

         成员变量使用时的内存分配:假设我们定义类的属性(成员变量)和类的行为(成员方法)如下:

public class student {
    String name;
    int age;
    int number;
    String address;

    public void course(){
        System.out.println("上课");
    }
    public void exam(){
        System.out.println("考试");
    }

}

     在主程序开始执行时内存也随机变化,主程序如下:

 public static void main(String[] args) {
        student st1 = new student();

        st1.name = "李明";
        st1.age = 23;
        st1.number = 1;
        st1.address = "北京";

        System.out.println(st1.name);
        System.out.println(st1.age);
        System.out.println(st1.number);
        System.out.println(st1.address);
        st1.course();
        st1.exam();


    }

2.1.1.当main()方法开始执行时,main()方法会存入栈内存中

2.1.2.student st1(定义学生类对象st1):此时在栈内存中会生成学生类对象(student st1),栈内存给分配相应的地址值。

2.1.3.new  student() (新建方法类student) :此时堆内存会为new student()开辟出一块新的内存,这块学生类内存具有类的所有属性(成员变量),成员变量有:String类型的name,int类型的age,number,String类型的address ,值得注意的是在栈方法内定义的变量是有默认值的,其中String类型变量的默认值是null,int类型的默认值是0.验证如下:

public static void main(String[] args) {
        student st1 = new student();
       
        System.out.println(st1.name);
        System.out.println(st1.age);
       System.out.println(st1.number);
       System.out.println(st1.address);
}


输出:
D:\develop\ITSYR\bin\java.exe "-javaagent:C:\Program Files (x86)\IDEA\IntelliJ IDEA 
null
0
0
null

进程已结束,退出代码为 0

 2.1.4.将栈内存中新开辟的学生类的地址  赋值给 学生类类型的对象 st1( student st1 = new student(); ):此时st1 是堆内存指向栈内存的地址值,验证如下:

public static void main(String[] args) {
        student st1 = new student();
        System.out.println("st1:"+st1);
}

程序运行结果:

st1:bolog_test01.student@6cd8737

进程已结束,退出代码为 0

2.1.5.为第一个成员变量赋值(st1.name = "李明";):st1表示地址,也就是堆内存指向栈内存的地址,.name表示在堆内存student内存空间下的name成员变量。赋值(="李明")表示将字符串“李明”赋值给成员变量name。    整条语句就是成员变量赋值过程中栈内存和堆内存的变化。其余成员变量按照这种方法依次赋值。

2.1.6.按照上面依次对成员变量进行赋值后,每个成员变量都具有了值,那么就可以对其进行输出。我们值得注意的是:st1.name我们可以理解为:对象st1中的name变量。

2.1.7.对象属性(成员方法)的调用:

     成员方法在调用时和普通方法在内存中的存储是一样的,当调用方法 ( st1.course();)时,首先成员方法course()会存入栈内存中,通过与其对应的对象st1确定方法的地址值,然后执行方法里面的内容,执行结束course从栈内存中删除。类似的另一个方法st1.exam();也是如此。

2.1.8.单个对象内存调用情况如上,代码执行如下图:

 public static void main(String[] args) {
        student st1 = new student();
       

        st1.name = "李明";
        st1.age = 23;
        st1.number = 1;
        st1.address = "北京";
        System.out.println("st1.name"+st1.name);
        System.out.println("st1.age"+st1.age);
        System.out.println("st1.number"+st1.number);
        System.out.println("st1.address"+st1.address);
        st1.course();
        st1.exam();
}

代码运行结果:
st1.name李明
st1.age23
st1.number1
st1.address北京
上课
考试

进程已结束,退出代码为 0

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值