Пытаясь понять наследование классов в Java - PullRequest
0 голосов
/ 15 мая 2018

Допустим, у меня есть суперкласс

public class SuperSub {
  public void overideThisMethod(){
    System.out.println("Printed from Superclass");
  }
}

И у меня есть подкласс, например,

public class SubClass2 extends SuperSub { 
  @Override
  public void overideThisMethod(){
    System.out.println("from subclass2");
  }
  public static void main(String[] args){
    SubClass2 subClass2= new SubClass2();
    subClass2.overideThisMethod();
    SuperSub superSub = new SuperSub();
    superSub.overideThisMethod();
  }
}

Я получаю вывод при запуске программы:

run:
from subclass2
Printed from Superclass

Если результат не будет, вместо этого,

run:
from subclass2
from subclass2

Любое разъяснение очень ценится, спасибо!

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

В вашем примере класс SubClass2 расширяет SuperSub, что означает, что все методы, вызываемые экземпляром SuperSub2, будут функционально такими же, как методы, вызываемые экземпляром SuperSub, за исключением тех, которые вы ' мы перезаписаны

В случае переменной subClass2 это экземпляр SubClass2, означающий, что он может вызывать все методы SuperSub, а также методы SubClass2.

Для метода, который существует в обоих классах, в вашем случае overideThisMethod, соответствующие методы будут вызываться в зависимости от типа вашей переменной. Для переменной subClass2 это экземпляр класса SubClass2, поэтому он вызывает соответствующий метод (и печатает «из подкласса 2»). Хотя переменная superSub является экземпляром класса SuperSub, она вызывает переменную overideThisMethod в своем собственном классе и печатает («Printed from Superclass»).

0 голосов
/ 15 мая 2018

Расширение (также называемое наследованием) не изменяет суперкласс , но на самом деле создает новый с расширениями, которые вы определяете , как и переопределение там.

Итак, оба класса существуют, каждый со своей логикой.

Здесь вы создаете класс с именем SuperSub, который печатает «Printed from Superclass». Затем вы используете это в качестве базы для создания другого класса SubClass2, который "маскирует" (a.k.a. переопределяет) базовое поведение, в данном случае, печатая вместо этого "из подкласса 2".

Таким образом, если вы создадите объект класса SuperSub , он все равно будет вести себя как SuperSub . Соответственно, если вы создаете объект класса SubClass2 , он будет вести себя как SuperSub с «расширениями», которые вы определите в SubClass2 (в этом случае переопределенное поведение ).

...