BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #49675同步于 2016/4/24
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

[问题]java中继承的一个问题,小白求指导~

hf007fs
2016/4/24镜像同步17 回复
//父类: public class Father { public String name = "father"; public boolean compare(Son son) { return (this == son); } public void setName(String name) { this.name = name; } } //子类: public class Son extends Father { public String name = "son"; } //测试类: public class FSmain { public static void main(String[] args) { Son s1 = new Son(); Son s2 = s1; System.out.println(s1.compare(s2)); System.out.println("-------------------"); s1.setName("change"); System.out.println(s1.name); } } 输出结果是 true 和 son this不是应该是谁调用这个方法就指代谁吗?s1第1次调用的是compare(),this指代的是s1。 s1第2次调用的是setName(),this指代的应该还是s1,为什么改变的成员变量却不是s1的? 纠结好久了,真心求教
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
hf007fs机器人#1 · 2016/4/24
@nuanyangyang 大神跪求指导啊
nuanyangyang机器人#2 · 2016/4/24
但是你最后s2.name并不是以Father的角度去get的。所以它看到的是Son#name而不是Father#name。试试加个getName,结果就不一样了: package cn.byr.nuanyangyang.father; //父类: class Father { public String name = "father"; public boolean compare(Son son) { return (this == son); } public String getName() { return name; } public void setName(String name) { this.name = name; } } // 子类: class Son extends Father { public String name = "son"; } // 测试类: public class Main { public static void main(String[] args) { Son s1 = new Son(); Son s2 = s1; System.out.println(s1.compare(s2)); System.out.println(s1.getName()); System.out.println("-------------------"); s1.setName("change"); System.out.println(s1.name); System.out.println(((Father)s1).name); System.out.println(s1.getName()); } } 结果: true father ------------------- son change change
fengzhiya机器人#3 · 2016/4/24
我的理解如下:子类有一段内存区域中(super指针),存放的是继承而来的父类对象的各种属性方法。 this是类对自己的一个引用。 s1.compare(s2)中,this实际是s1存储的父类的引用,因为这段内存区域在子类的内存区域中,所以地址相同,返回true。 同理,s1.setName("change")改变的只是 子类s1内存中 父类区域的name的值,并不是s1的name值。
hf007fs机器人#4 · 2016/4/24
弱弱的问一下:Son#name是神马意思 【 在 nuanyangyang 的大作中提到: 】 : 但是你最后s2.name并不是以Father的角度去get的。所以它看到的是Son#name而不是Father#name。试试加个getName,结果就不一样了: : [code=java] : package cn.byr.nuanyangyang.father; : ...................
nuanyangyang机器人#5 · 2016/4/24
【 在 hf007fs 的大作中提到: 】 : 弱弱的问一下:Son#name是神马意思 Son类的name成员
hf007fs机器人#6 · 2016/4/24
在compare中如果this存的是父类的引用的话,从结果为true看,你的意思是父类的引用和子类的引用是相同的吗,那又如何通过引用区分父类和子类的实例呢? 【 在 fengzhiya 的大作中提到: 】 : 我的理解如下:子类有一段内存区域中(super指针),存放的是继承而来的父类对象的各种属性方法。 this是类对自己的一个引用。 s1.compare(s2)中,this实际是s1存储的父类的引用,因为这段内存区域在子类的内存区域中,所以地址相同,返回true。 同理,s1.setName("change")改变的只是 子类s1内存中 父类区域的name的值,并不是s1的name值。
ml3615556机器人#7 · 2016/4/24
this.name = name; 等价于 Father.this.name = name; 这样写应该就理解了吧
hf007fs机器人#8 · 2016/4/24
你的意思是在初始化的时候Father.this.name就已经指向了Father的name,那么在compare方法中,这个this也实际上是Father.this吗?如果不是,又为什么会这样呢? 【 在 ml3615556 的大作中提到: 】 : this.name = name; : 等价于 : Father.this.name = name; : ...................
hf007fs机器人#9 · 2016/4/24
我能理解向上转型后通过father.name看到的是father的成员变量,但是我不能理解的是s1在调用父类的setName()方法中这个this指代的应该是s1,但是s1.name却并不是s1的成员变量 【 在 nuanyangyang 的大作中提到: 】 : Son类的name成员