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

6

我有一个子类对象,它继承了父类。在子类中有一个重写的方法,可以使用该对象调用。那么是否可能使用子类对象调用父类的函数?

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");
    }
}

考虑以上代码。
这里会打印出"Subclass go"。相反,我应该打印出"Superclass go"。
5个回答

16

不,这是不可能的。如果您认为需要这样做,请重新考虑您的设计。覆盖方法的整个目的是替换其功能。如果另一个类知道那个类的内部工作原理,那么您完全破坏了封装性。


但是那么超级关键字有什么意义呢?它们是一样的,这只是语法上不可能,我找不到任何逻辑背后的原因。 - SpawN
super关键字的作用是允许您在覆盖它的类中访问覆盖的功能。这对于像装饰器之类的东西绝对有意义。这与本问题非常不同,本问题是关于不同类通过子类对象访问超类功能。这根本没有意义,基本上是第三个类说:“我不在乎子类实现者的意图,我想以不同的方式做!” - Michael Borgwardt

3
这里打印的是“Subclass go”,而我需要打印“Superclass go”。
好的,那么如果不在子类中重写go方法,则会调用超类的实现。
如果你想运行超类的实现,并在子类中添加其他额外的代码,可以调用super.go(); 然后再执行其他语句。
这样做没问题,因为你正在重用已经编写好的代码,所以不应该将超类的代码复制粘贴到子类中,因为这是代码重复。但是,如果你的目标是完全改变行为,则不要调用super。

2

改为:

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

写作
super.go();

(或者,你知道的,就不要实现那个方法……)。

是的。但有时我也会使用子类的方法。难道没有其他方式可以调用超类的方法吗?比如 obj.super.go() 这样的东西?当然,这是错误的语法。我是指类似的东西。 - bdhar
1
@bdhar:是的,你可以直接调用super。但是你需要在类内部进行该调用。它不能从外部完成。 - Noon Silk
@silky.. 你能否提供一个例子来说明你在上面的讨论中所提到的“你需要在类内部进行调用,而不能从外部进行调用”的情况。 - user295837

0
一种方法是使子类调用超类的实现。但是我假设这不是您想要的吗?
class SubClass extends SomeClass {    
SubClass() {}    
    @Override    
    public void go() {    
        super.go
    }
}

@Steve.. 使用super关键字调用超类函数确实是正确的方法。我想知道的是,是否有其他方法可以使用"obj"作为引用来调用超类的go()方法? - user295837

0

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接