返回信息流//父类:
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的?
纠结好久了,真心求教
这是一条镜像帖。来源:北邮人论坛 / java / #49675同步于 2016/4/24
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
[问题]java中继承的一个问题,小白求指导~
hf007fs
2016/4/24镜像同步17 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
但是你最后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
我的理解如下:子类有一段内存区域中(super指针),存放的是继承而来的父类对象的各种属性方法。 this是类对自己的一个引用。 s1.compare(s2)中,this实际是s1存储的父类的引用,因为这段内存区域在子类的内存区域中,所以地址相同,返回true。 同理,s1.setName("change")改变的只是 子类s1内存中 父类区域的name的值,并不是s1的name值。
弱弱的问一下:Son#name是神马意思
【 在 nuanyangyang 的大作中提到: 】
: 但是你最后s2.name并不是以Father的角度去get的。所以它看到的是Son#name而不是Father#name。试试加个getName,结果就不一样了:
: [code=java]
: package cn.byr.nuanyangyang.father;
: ...................
在compare中如果this存的是父类的引用的话,从结果为true看,你的意思是父类的引用和子类的引用是相同的吗,那又如何通过引用区分父类和子类的实例呢?
【 在 fengzhiya 的大作中提到: 】
: 我的理解如下:子类有一段内存区域中(super指针),存放的是继承而来的父类对象的各种属性方法。 this是类对自己的一个引用。 s1.compare(s2)中,this实际是s1存储的父类的引用,因为这段内存区域在子类的内存区域中,所以地址相同,返回true。 同理,s1.setName("change")改变的只是 子类s1内存中 父类区域的name的值,并不是s1的name值。
你的意思是在初始化的时候Father.this.name就已经指向了Father的name,那么在compare方法中,这个this也实际上是Father.this吗?如果不是,又为什么会这样呢?
【 在 ml3615556 的大作中提到: 】
: this.name = name;
: 等价于
: Father.this.name = name;
: ...................
我能理解向上转型后通过father.name看到的是father的成员变量,但是我不能理解的是s1在调用父类的setName()方法中这个this指代的应该是s1,但是s1.name却并不是s1的成员变量
【 在 nuanyangyang 的大作中提到: 】
: Son类的name成员