Java Sub Classing: переопределение и создание новых методов - PullRequest
0 голосов
/ 01 октября 2019

Ресурсы, которые учат Java, похоже, имеют противоречивые ответы о том, возможно ли одновременно переопределить метод родительского класса, а также создать новый метод из подкласса одновременно. Когда я пытаюсь сделать следующее:

class ABC{
     //Overridden Method
     public void disp(){
          System.out.println("disp() method of parent");
     }
}

class DEF extends ABC{
     //Overriding Method
     public void disp(){
          System.out.println("disp() method of child");
     }
     //new method in the subclass
     public void newMethod(){
          System.out.println("new method of child class");
     }
     public static void main(String args[]){
          ABC obj = new ABC();
          obj.disp();
          ABC obj2 = new DEF();
          obj2.disp();
          obj2.newMethod();
     }
}

java выдает ошибку «not find symbol». Я что-то упускаю? Кажется странным, что нельзя сделать и то и другое одновременно, и все же я не могу избежать этой ошибки.

Ответы [ 2 ]

6 голосов
/ 02 октября 2019

Если у вас есть ссылка на объект, где переменная определена как ABC, то вы можете вызывать только те методы, которые определены в классе ABC. Даже если базовый объект имеет тип DEF, сама переменная определена для хранения ABC.

Попробуйте изменить код из этого:

ABC obj2 = new DEF();

на следующее:

DEF obj2 = new DEF();

Это будет работать, потому что вы определяете obj2 для типа DEF.

Вот еще один пример, показывающий создание строки, сначала с переменной, определенной для типа String, а другой с типом, определенным как Object.

String s = new String();
s.charAt(99);             <-- this is valid on a String

Object o = new String();
o.charAt(99);             <-- same thing, but not allowed on Object

Обходной путь должен был бы использовать instanceof для проверки, действительно ли obj2 является экземпляром DEF, и если да, временноиспользуйте его как DEF, разыгрывая его так:

if (obj2 instanceof DEF) {
    ((DEF) obj2).newMethod();
}
3 голосов
/ 02 октября 2019

Здесь ABC - суперкласс, а DEF - подкласс. Поэтому, когда вы делаете ABC obj2 = new DEF();, obj2 может получить доступ только к тем функциям, которые определены в ABC. Так как newMethod() не определен в ABC, вы не можете вызвать его с помощью obj2.

...