超级对战这三个班级

时间:2013-11-22 18:54:47

标签: java inheritance this super

假设您有一个扩展父类A的B类。要访问B的方法,您可以使用它。要访问A,您将使用super。如果你有一个扩展B类的第三个C类,你可以使用它来访问C和super的方法来访问B.你如何从C类访问A的方法?

2 个答案:

答案 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)。如果您正在使用其他人的图书馆并且您无法更换祖父母,那么您需要直接从祖父母那里继承。

另外,如果你发现自己需要使用超级很多,那么你可能做错了。