标签: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