Java 使用子类对象访问超类函数
我有一个扩展其超类的子类的对象。子类中有一个重写的方法,可以使用对象调用该方法。 是否可以使用子类对象调用超类的函数Java 使用子类对象访问超类函数,java,inheritance,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()?
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");
}
}
考虑上面的代码
这里印着
子类go
。相反,我必须打印
超类go
.而不是:
System.out.println("Subclass go");
写
(或者,你知道,只是不实现那个方法…。有什么方法可以实现这一点吗?不,没有 在运行时,JVM将根据实例类型(这对您来说是多态性)选择要调用的方法,而不是根据其声明的类型
您的实例是一个子类实例,因此将调用子类中的go()方法。一种方法是使子类调用超级类实现。但我想那不是你想要的
class SubClass extends SomeClass {
SubClass() {}
@Override
public void go() {
super.go
}
}
不,这是不可能的,如果你认为你需要它,重新考虑你的设计。重写方法的全部目的是替换其功能。如果另一个类对该类的内部工作有那么多了解,那么您就完全扼杀了封装 子类go . 相反,我必须打印 超类go 好的,那么不要重写go方法@subclass,它将调用超类实现 如果您想运行super实现,并拥有其他一些额外的代码@subclass,可以调用super.go();然后运行一些其他语句
这没关系,因为您正在重用已经编写的代码,所以不应该从超类复制粘贴代码并将其放入子类中,因为这是代码复制。但如果你的目标是彻底改变行为,那就不要叫“超级”Yeah。但有时我也会使用subclass的方法。难道不能用其他方式调用超类的方法吗?类似于obj.super.go()的东西???当然,这是一个错误的构造。我的意思是类似的???@bdhar:是的,你可以直接调用
super
。但是你需要在课堂上打电话。这不能从外部完成。@silky。。你能提供一个你在上面的帖子中提到的例子吗?“你需要在课堂上打那个电话。这不能在外部完成”@Steve。。使用super关键字调用超类函数确实是正确的方法。我想知道的是,是否有其他方法可以调用超类go()方法,使用“obj”作为引用??但是super关键字的意义是什么,它是一个,同样的,这在语法上是不可能的,我找不到它背后的任何逻辑。super关键字的要点是,它允许您访问覆盖它的类中被覆盖的功能。这对像装饰师这样的人来说绝对有意义。这和这个问题完全不同,这个问题是关于一个不同的类通过一个子类对象访问超类功能。这完全没有意义,它基本上是第三个类说“我不在乎子类实现者想要什么,我想用不同的方式来做!”
class SubClass extends SomeClass {
SubClass() {}
@Override
public void go() {
super.go
}
}