Java程序执行过程的内存分析

类的属性

1.属性(field),或者叫成员变量
2.属性用于定义该类或该类对象包含的数据或者说静态属性
3.属性的作用范围是整个类体
4.**在定义成员变量时,可以对其初始化,如果不对其初始化,Java使用默认的值对其初始化:
数值:0、0.0
字符:\u0000(Unicode编码中对应的0)
boolean:false
所有引用类型:null**
5.属性定义格式:
[修饰符] 属性类型 属性名 = [默认值];

程序执行过程的内存分析

示例一:

Student.java

package cn.bjsxt.oop;

public class Student {
    //静态的数据
     String name;
     int id;    //学号
     int age;
     String gender;
     int weight;

    //动态的行为
     public void study(){
         System.out.println(name+"在学校");
     }

     public void sayHello(String sname){
         System.out.println(name+"向"+sname+"說:你好!");
     }

Test1.java

package cn.bjsxt.oop;

public class Test1 {
     public static void main(String[] args) {
         //通过类加载器Class Loader加载Student类。 加载后,在方法区中就有了Student类的信息!
        Student s1 = new Student();

        s1.name = "高琪";
        s1.study();
        s1.sayHello("馬士兵");

        Student s2 = new Student();
        s2.age = 18;
        s2.name="老高";       
    }
}

内存分析示意图(图中的地址是随意写的,没有根据):
这里写图片描述


示例二:
Student.java

package cn.bjsxt.oop;

public class Student {
    //静态的数据
     String name;
     int id;    //学号
     int age;
     String gender;
     int weight;

     Computer computer;

    //动态的行为
     public void study(){
         System.out.println(name+"在学校");
     }

     public void sayHello(String sname){
         System.out.println(name+"向"+sname+"說:你好!");
     }

Test2.java

package cn.bjsxt.oop;

public class Test2 {
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.name = "高琪";
        s1.age = 18;

        Computer c = new Computer();
        c.brand = "联想";
        c.cpuSpeed = 100;

        s1.computer = c;

        c.brand = "戴尔";

        System.out.println(s1.computer.brand);
    }
}

内存分析示意图(图中的地址是随意写的,没有根据):
这里写图片描述

分析:由此可见,Java中看不见指针,却处处是指针。
首先,创建Student、Computer和Test2类时,将类中的信息、static变量、变量池等放入方法区(堆)中。
进入main函数:
Student s1 = new Student(); 调用构造器,在堆中创建一个对象,属性皆为默认值,方法中的地址指向方法区中的对应的方法。s1在main函数中,是局部变量,所以在栈中产出,并将构造器在方法区创建的对象的引用赋值给s1。
s1.name = “高琪”; 将方法区中常量池中的”高琪”的引用赋值给对象属性name。(常量池有共享机制,即在Comput中使用”高琪”和在Student中使用的是相同的值)
s1.age = 18; 直接将对象中的age属性中的值由0该为18。
后面的语句原理相同,无非是引用间的相互赋值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值