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