Вызовите переопределенный метод из суперкласса

У меня есть вопрос о переопределении методов. если у меня есть класс, который имеет метод, который может быть переопределен подклассами, но вызывается в суперклассе

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");
    }
}
Другие вопросы по тегам