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

来源:互联网 发布:php 微信扫码支付接口 编辑:程序博客网 时间:2024/06/06 09:13

类的属性

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。
后面的语句原理相同,无非是引用间的相互赋值。

0 0