Noa*_*hop 14 java inheritance this
我有一堂课
public class A {
public String attr ="A attribute";
public void method() {
System.out.println(this+" , "+this.attr);
}
public String toString() {
return("Object A");
}
}
Run Code Online (Sandbox Code Playgroud)
还有另一个继承自它的类
public class B extends A{
public String attr = "B attribute";
public void method() {
super.method();
}
public String toString() {
return("Object B");
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,method()of B只是for method()的包装A。
当我运行以下代码
B b = new B();
b.method();
Run Code Online (Sandbox Code Playgroud)
我得到的意思Object B , A attribute是输出,this并this.attr访问了不同的内容。为什么会这样?
不应该System.out.println(this)参考toString()课堂方法A吗?
Ond*_* K. 13
通过声明一个与父类同名的方法,您可以覆盖它,即替换原始行为。但是,如果声明一个具有相同名称的字段,则可以有效地隐藏它,从而使该子类无法访问它,但只能通过来访问super.field。有关变量隐藏以及使用关键字super的信息,请参见oracle docs 。请注意,不建议使用变量隐藏,因为它会造成您正遇到的混乱。
通过调用super.method(),打印会this导致调用toString方法,该方法实际上已被覆盖-因此,正如您在B实例上调用该方法一样,这就是它打印“对象B”的原因。但是thisin this.attr实际上是指父对象,就像您method从父类(by super.method())调用一样。