Вызовите переопределенный метод из суперкласса
У меня есть вопрос о переопределении методов. если у меня есть класс, который имеет метод, который может быть переопределен подклассами, но вызывается в суперклассе
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
}
}
как я называю имплиментацию класса В метода из класса А
5 ответов
Возможно, вы имели в виду:
public class b extends a
В этом случае код:
a aa = new b();
Позвоню b.callMethod()
, Обратите внимание, что вызов переопределенных (не закрытых) методов из конструктора - плохая идея.
Вы не можете, но вы можете создать конструктор для класса b, рабочий процесс вызова будет следующим fileds a - > constructor a - > method from a-> constructor b - > method from b
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
}
}
Но не делай этого. Этот вызывающий метод из конструктора в суперклассе - кошмар обслуживания и плохой дизайн.
Если вы измените видимость callMethod
метод для protected
затем b.callMethod()
это то, что называется, даже из суперкласса.
Ключевое слово protected сообщает Java, что метод виден подклассам; и, соответственно, делает его виртуальным.
Следующее приводит к ошибке компилятора: "Требуется включающий экземпляр, содержащий Demo.AB". Это обсуждается в: Требуется включающий экземпляр, который содержит
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");
}
}