#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:
Короче говоря, вы не можете этого сделать — виртуальная отправка делегировала бы вызов указанному.