使用子类对象访问超类函数

时间:2010-03-12 11:10:08

标签: java inheritance

我有一个子类的对象扩展其超类。子类中有一个重写的方法,可以使用该对象调用。 是否可以使用子类对象调用超类的函数?

package supercall;

public class Main {

    public static void main(String[] args) {
        SomeClass obj = new SubClass();
        obj.go();   //is there anything like, obj.super.go()?
    }

}

class SomeClass {
    SomeClass() {

    }
    public void go() {
        System.out.println("Someclass go");
    }
}

class SubClass extends SomeClass {
    SubClass() {

    }
    @Override
    public void go() {
        System.out.println("Subclass go");
    }
}

考虑上面的代码。

这里打印

  

子类去

。相反,我必须打印

  

超级课程

5 个答案:

答案 0 :(得分:15)

不,这是不可能的,如果你认为你需要它,重新考虑你的设计。覆盖方法的重点是替换其功能。如果一个不同的类对该类的内部工作了解得太多,那么你就完全杀死了封装。

答案 1 :(得分:3)

在这里打印 子类去 。相反,我必须打印 超类去

好吧,那么不要覆盖go方法@ subclass,它会调用超类实现。

如果你想运行超级实现,并且有一些其他代码@ subclass,你可以调用super.go();然后运行一些其他语句。

没关系,因为你正在重用已编写的代码,你不应该从超类复制粘贴代码并将其放入子代码中,因为它是代码重复。但如果你的目标是完全改变行为,那就不要打电话给超级

答案 2 :(得分:2)

而不是:

System.out.println("Subclass go");

super.go();

(或者,你知道,只是不要实现那种方法......)。

答案 3 :(得分:0)

有没有办法实现这个目标?不,没有。

在运行时,JVM将根据实例类型(这是您的多态性)选择要调用的方法,而不是基于它声明的类型。

您的实例是子类实例,因此将调用子类中的go()方法。

答案 4 :(得分:0)

一种方法是让子类调用超类实现。但我假设那不是你想要的?

class SubClass extends SomeClass {    
SubClass() {}    
    @Override    
    public void go() {    
        super.go
    }
}