package day3.test2;
public class Student {
String name;
int age;
public void study() {
System.out.println("好好学习");
}
}
package day3.test2;
public class StudentTest {
public static void main(String[] args) {
Student s=new Student();
System.out.println(s);
System.out.println(s.name+" "+s.age);
s.name="阿强";
s.age=23;
System.out.println(s.name+" "+s.age);
s.study();
}
}

运行StudentTest
1.把 StudentTest 的字节码文件 StudentTest.class加载到方法区,临时存储main方法;
2.main方法进入栈内存;
3.创建一个Student的对象s,先在方法区加载Student.class(内部含有所有的成员变量和成员方法),然后在main方法中开辟一个空间s(用来存储Student类的对象的地址值)。又在堆内存中开辟一个空间(地址值为day3.test2.Student@1b6d3586),空间内有Student的所有成员变量,以及成员方法的地址值(用来找到class中的方法 ),然后对成员变量进行默认初始化,并通过“=”运算符把空间的地址值赋值给栈内存中的变量s;
4.输出s,s中存储的是地址值,所以输出地址值;
5.输出s.name s.age,此时s.name和s.age都是默认值,输出 null 0;
6.把 阿强 赋值给s.name,即把 阿强 赋值给 day3.test2.Student@1b6d3586.name,堆内存空间 中的name的值由默认值null变为”阿强“;
7.把 23 赋值给s.age,即把 23 赋值给 day3.test2.Student@1b6d3586.age,堆内存空间中的age的值由默认值0变为”阿强“;
8.输出s.name s.age,此时s.name和s.age为 阿强 和 23 ,输出 阿强 23;
9.通过s调用study方法,先通过s找到堆内存空间,然后通过堆内存空间的成员方法的地址值找到方法区的成员方法,study方法加载进栈,打印“好好学习”,study方法执行完毕,出栈;
10.main方法执行完毕,出栈,堆内存空间因为没有变量指向,空间回收

基本数据类型:数据值是存储在自己的空间中,赋值给其他变量,也是赋的真实的值
int a=10;
int b=a;//b=10
引用数据类型:数据值是存储在其他空间中,自己空间存储的是地址值,赋值给其他变量,赋的地址值,如上述中的 s 存储的就是地址值,指向堆内存中的空间
Student s1=new Student();
Student s2=s1;//s2中存储的也是地址值

被折叠的 条评论
为什么被折叠?



