Вызовите переопределенный метод из суперкласса - PullRequest
0 голосов
/ 19 октября 2011

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

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
  }
  }

как вызвать метод класса b из класса a

Ответы [ 5 ]

1 голос
/ 19 октября 2011

Возможно, вы имели в виду:

public class b extends a

В этом случае код:

a aa = new b();

Позвонит b.callMethod(). Обратите внимание, что вызов переопределенных (не закрытых) методов из конструктора - плохая идея.

0 голосов
/ 19 октября 2011
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
  }
}

Но не делай этого.Этот вызывающий метод из конструктора в суперклассе - кошмар обслуживания и плохой дизайн.

0 голосов
/ 19 октября 2011

вы не можете, но вы можете создать конструктор для класса b, рабочий процесс вызова будет следующим fileds a - > constructor a - > method from a-> constructor b - > method from b

0 голосов
/ 19 октября 2011

Следующее приводит к ошибке компилятора: «Требуется включающий экземпляр, содержащий Demo.A.B». Это обсуждается в: Требуется включающий экземпляр, который содержит <мою ссылку> . Итак, ответ: вы не можете этого сделать. Запишите его в свой собственный файл класса вместо вложенного класса.

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");
    }
}
0 голосов
/ 19 октября 2011

Если вы измените видимость метода callMethod на protected, тогда b.callMethod() будет вызываться даже из суперкласса.

Защищенное ключевое слово сообщает Java, что метод виден подклассам; и, как следствие, делает его виртуальным.

...