Как вызвать метод базового класса с объектом производного класса, когда этот метод переопределен в производном классе?

#java

#java

Вопрос:

 class A 
{
  public void m1()
  {
    System.out.println("hi-base class");
  }
}

class B extends A
{
  public void  m1()
  {
    System.out.println("hi-derived ");
  }

  public static void main(String args[])
  {
    B b1=new B();
  }
}
  

В этом я хочу вызвать метод базового класса m1 с помощью производного объекта класса без использования супер

Комментарии:

1. Этот код не будет компилироваться. Сначала вы должны это исправить.

2. И почему вам нужно вызывать m1 без super? Это не какая-то ставка на бар, не так ли?

3. @Andrew Просто это мое требование, не более того

4. C # делает то, что хочет Srikanth, и C тоже! Java этого не делает.

Ответ №1:

Вам нужно будет создать объект типа A. Вы переопределили метод m1 в производном классе, и поэтому при любых вызовах m1 для объекта, который был создан как B, будет вызываться B-версия m1. Без использования super нет способа указать компилятору выполнить невиртуальный вызов версии базового класса.

Комментарии:

1. Спасибо, что поделились 4, но можно вызвать метод базового класса с помощью производного объекта класса, я не знаю синтаксиса

2. Это может быть, но вот мой вопрос: почему вы хотите и / или должны это делать?

Ответ №2:

Вы просто ищете super.m1(); ? Это вызовет метод непосредственного родителя.

Однако вы не можете создать экземпляр объекта типа B извне B и использовать это.

Вы не можете сделать:

 B value = new B();
value.super.m1(); // call A's implementation
  

Однако вы могли бы сделать это в B:

 @Override
public void m1()
{
    System.out.println("hi from B");
    super.m1();
}

public void useAM1()
{
    super.m1();
}
  

Конечно, когда вы начинаете предоставлять обходные пути для получения функциональности от A , тогда это звучит так, как будто вы злоупотребляете наследованием или, по крайней мере, должны были использовать экземпляр A для начала.

Интересно, что в C вы могли бы сделать это: value->A::m1(); . К счастью, в Java нет эквивалента.

Комментарии:

1. По причинам, которые я не могу понять, OP явно хочет избежать использования super , и он совершенно уверен, что это можно сделать.

2. Я смотрел на ваш ответ и был так же смущен их ответом, поэтому я хотел выбросить явный super.m1(); ответ на всякий случай, если он не понял его использования.

Ответ №3:

Короче говоря, вы не можете этого сделать — виртуальная отправка делегировала бы вызов указанному.