Можем ли мы вызвать super.someMethod () в производном классе от абстрактного класса?

1

Можем ли мы назвать super.someMethod() в производном классе абстрактным классом?

например:

abstarct class TestBase{
   void nonabstractMethod(){
   ....
  }
}

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

class Child extend TestBase{
   void callFunction(){

   }
   void nonabstractMethos(){
   super.nonabstractMethos();
  }
}

Я предполагаю, что это можно сделать. Но если у нас есть абстрактный метод, тогда он не может быть вызван из-за отсутствия реализации, я прав?

  • 1
    попробуйте, и вы увидите результат.
Теги:
inheritance
abstract-class

3 ответа

1
Лучший ответ

Да вы правы. Если вы расширяете абстрактный класс с абстрактным методом, вы не можете вызвать super.thatMethod(); Рассмотрим следующий пример

public class  RSAService {
    protected void doRSA(){}
}

class MyService extends RSAService{
    public void myService(){
        super.doRSA(); //Works fine
    }
}

Это будет работать, поскольку doRSA() доступен из MyService. То же самое для public но не для private

Но

    public abstract class  RSAService {
    protected abstract void doRSA();
}

class MyServe extends RSAService{
    public void myService(){
        super.doRSA(); //This won't work
    }

    @Override
    protected void doRSA() {
    }
}

Теперь рассмотрим этот случай, где вы можете вызвать super.superClassMethod() из вашего подкласса

public abstract class  RSAService {
    protected void doRSA(){}
}

class MyService extends RSAService{
    public void myService(){
    }

    @Override
    protected void doRSA() {
        super.doRSA();
    }
}

Поэтому, если вы переопределяете метод суперкласса, вы можете вызвать метод, используя super. Рассмотрим эту ссылку Java Specification для получения дополнительных пояснений

  • 2
    На его примере абстрактный метод не защищен, поэтому .. он будет работать, только если оба класса находятся в одном пакете
  • 0
    Спасибо @shikjohari за хорошо объясненный пример.
1

Ваш пример будет работать, если оба класса находятся в одном пакете.

Если это не так, вы должны объявить метод защищенным или общедоступным, например:

abstract class TestBase{
   protected void nonabstractMethod(){
   ....
   }
}

Если ваш метод является абстрактным, то вы не можете его называть, например:

abstract protected void abstractMethod();
  • 0
    Спасибо Caelos за ответ.
1

Короткий ответ: да.

Вы всегда можете вызвать public или protected супер метод. Как и любой (экземпляр) метод в java, он будет обрабатываться политически, и конкретная реализация будет вызвана либо суперклассом, либо производным классом, если он переопределит его.

  • 0
    Спасибо Мурейник за ваш ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню