我有一个关于覆盖方法的问题。 如果我有一个类a有一个方法可以被子类覆盖但是在超类中调用
public class a {
//this is the main class
public a() {
//etc code
callMethod();
}
void callMethod() {
//do nothing here. will be overriden in subclas
}
public class b extends a {
void callMethod() {
//actually impliment here
}
}
如何从类a
调用类b对方法的实现答案 0 :(得分:1)
可能你的意思是:
public class b extends a
在这种情况下代码:
a aa = new b();
将致电b.callMethod()
。请注意,从构造函数中调用overriden(非私有)方法是个坏主意。
答案 1 :(得分:0)
如果您将callMethod
方法的可见性更改为protected
,那么b.callMethod()
就会被调用,即使是来自超类。
protected关键字告诉Java该方法对子类是可见的;并通过扩展使其成为虚拟的。
答案 2 :(得分:0)
以下结果导致编译器错误:“需要包含Demo.A.B的封闭实例。”这在下面讨论:An enclosing instance that contains <my reference> is required。所以,答案是:你做不到。将它写入自己的类文件而不是嵌套类。
package Demo;
import Demo.A.B;
public class Demo {
public static void main(String[] args) {
A test = new B();
}
}
Package Demo;
public class A {
public A() {
callMethod();
}
void callMethod() {
System.out.println("Called from A");
}
public class B extends A {
@Override
void callMethod() {
System.out.println("Called from B");
}
}
}
(A.java)
Package Demo;
public class A {
public A() {
callMethod();
}
void callMethod() {
System.out.println("Called from A");
}
}
(B.Java)
package Demo;
public class B extends A {
@Override
void callMethod() {
System.out.println("Called from B");
}
}
答案 3 :(得分:0)
你不能但是你可以为b类创建构造函数,调用工作流将是下一个fileds a - > constructor a - > method from a-> constructor b - > method from b
答案 4 :(得分:0)
public abstract class a {
//this is the main class
public a() {
//etc code
callMethod();
}
abstract void callMethod();
}
public class b extends a {
void callMethod() {
//actually impliment here
}
}
但不要这样做。这个调用方法来自超类中的构造函数维护噩梦和糟糕的设计。