标签:idt 技术 默认 步骤 赋值 vat 没有 相同 栈内存





![]()



行为就是对象能够干什么





代码示例:


代码示例:





public class Student { String name; int age; public void study(){ System.out.println("好好学习"); } public void doHomework(){ System.out.println("多多练习"); } } public class StudentTest { public static void main(String[] args) { //创建第一个对象并使用 Student s1 = new Student(); System.out.println(s1.name);//null System.out.println(s1.age);//0 s1.name="林青霞"; s1.age=10; System.out.println(s1.name);//林青霞 System.out.println(s1.age);//10 s1.study();//好好学习 s1.doHomework();//多多练习 } }
栈内存:存放静态变量、方法、常量、局部变量
堆内存:存放new出来的对象、数组、成员变量
这是一个测试类

先从main方法开始,main方法被加载到栈内存

创建对象,它会被加载到栈内存中

new Student(),在堆内存中new一片空间放入成员遍历,并赋值默认值。
方法没有调用,所以不会加载。

s指向堆内存中new出来的地址,这样就可以使用堆内存中的数据了。

输出s,因为s指向001,所以输出001.

s指向001,name指向001中的name,所以输出null

s指向001,age指向001中的age,所以输出0

最后拼接输出,null,0

s.name = “张曼玉”; 通过s(001)找到name,给他赋值"张曼玉"

和上面一样age的值修改为28

再次输出的时候就成了,张曼玉,28

s.study(); 首先找都Studen对象中的study方法,将它加载到栈内存中,而s(001)就是它的调用者。

接下来进入study方法中,输出"好好学习"

当这个方法执行完毕就会从栈内存中消失。
接下来的doHoework();方法和study()方法一样。
因为new 是在堆内存中开辟一块空间,所以,s1和s2是不一样的,互不影响。




把s1(001)赋值给s2,这样s1和s2就都指向了堆内存中的001
把第一个对象的地址赋值给第二个对象

因为s2指向的堆内存地址也是001,所以把name修改为"张曼玉"

同上age的值变为28

因为s1和s2的堆内存地址值是一样的,所以他们俩输出的结果是一样的。

s1输出的是张曼玉,28

s2输出的也是张曼玉,28








this修饰的变量是成员变量;this代表所在类的对象引用,方法被哪个对象调用,this就代表哪个对象



s1调取setName方法,setName()进入栈内存
形参name是传递过去的"林青霞"
调用者是s1(001)

setName()方法中的this就是s1(001)

this就是调用者s1(001),name是001地址中的name,name是参数"林青霞"赋给001中的name

s2在堆内存空间中再开辟一块空间,和s1互不干扰。

总结:调用者是谁this就代表了谁




标签:idt 技术 默认 步骤 赋值 vat 没有 相同 栈内存
原文地址:https://www.cnblogs.com/ajing2018/p/14642179.html