我上课
public class A {
public String attr ="A attribute";
public void method() {
System.out.println(this+" , "+this.attr);
}
public String toString() {
return("Object A");
}
}
和从其继承的另一个类
public class B extends A{
public String attr = "B attribute";
public void method() {
super.method();
}
public String toString() {
return("Object B");
}
}
请注意,method()
的{{1}}只是B
的{{1}}的包装。
当我运行以下代码时
method()
我得到A
作为输出,这意味着B b = new B();
b.method();
和Object B , A attribute
访问了不同的事物。为什么会这样呢?
this
是否应该引用类this.attr
的{{1}}方法?
答案 0 :(得分:14)
通过声明一个与父类同名的方法,您可以覆盖,即替换原始行为。但是,如果声明一个具有相同名称的字段,则可以有效地隐藏,使该子类无法访问它,但只能通过super.field
进行访问。有关variable hiding以及使用keyword super的信息,请参见oracle文档。请注意,不建议使用变量隐藏,因为它会造成您正遇到的混乱。
通过调用super.method()
,打印this
会导致调用toString
方法,该方法实际上已被覆盖-因此,这就是您打印“对象B”的原因在B的实例上调用了方法。但是this
中的this.attr
实际上是指父对象,因为您是从父类中调用method
(通过{{1} }。