假设您有一个扩展父类A的B类。要访问B的方法,您可以使用它。要访问A,您将使用super。如果你有一个扩展B类的第三个C类,你可以使用它来访问C和super的方法来访问B.你如何从C类访问A的方法?
答案 0 :(得分:0)
你实际上不能,因为它会违反封装原则。 但是,您可以在B类中创建一个与A相同的方法,并获得所需的结果。
答案 1 :(得分:0)
让我们使用这个例子:
class Bird {
public final void eat() {
//...
}
public boolean canFly() {
return true;
}
}
class FlightlessBird extends Bird {
public boolean canFly() {
return false;
}
}
class Ostrich extends FlightlessBird {
public void takeoff() {
if (canFly()) {
//....
}
}
}
Ostrich扩展了FlightlessBird,因此canFly()
将始终返回false。如果可以的话,不管怎么说super.super.canFly()
,你最终会得到一只飞行的鸵鸟,这是任何人都不想看到的。基本上,方法被覆盖是有原因的,并且可能导致灾难性的结果。如果你需要在所有子类中使用一个方法,那么将它标记为final,这样它就不能被覆盖(比如上面的例子中的eat)。如果您正在使用其他人的图书馆并且您无法更换祖父母,那么您需要直接从祖父母那里继承。
另外,如果你发现自己需要使用超级很多,那么你可能做错了。