Java: суперкласс и подкласс - PullRequest
       35

Java: суперкласс и подкласс

1 голос
/ 03 февраля 2011
  1. Может ли переменная подкласса быть приведена к любому из ее суперклассов?
  2. Может ли переменной суперкласса быть назначена любая переменная подкласса?
  3. Может ли суперклассу быть назначена любая переменная?
  4. Если это так, можно ли переменной интерфейса присвоить переменную из какого-либо реализующего класса?

Ответы [ 5 ]

10 голосов
/ 03 февраля 2011

Все собаки тоже животные?

Все ли животные тоже собаки?

Если вам нужно животное, а я даю вам собаку, это всегда приемлемо?

Если вам нужна собака специально, но я даю вам любое животное, это может быть проблематично?

Если вам нужно что-то, что вы можете водить, но вам все равно, что это такое, пока есть такие методы, как .Accelerate и .Steer, вас волнует, если это Porsche или скорая помощь?

7 голосов
/ 03 февраля 2011
  • Да
  • Вы можете присвоить подклассу экземпляр переменной суперкласса
  • А?
  • Вы можете присвоить экземпляр класса переменной любого типа интерфейса, который класс реализует
3 голосов
/ 03 февраля 2011

Просто для ясности рассмотрим:

class A extends B implements C {  }

Где A - это подкласс, B - это суперкласс, а C - это интерфейс, который реализует A.

  1. Подкласс может быть приведен вверх к любому суперклассу.

    B b = new A();
    
  2. Суперкласс не может быть приведен вниз к какому-либо подклассу (это неразумно, поскольку у подклассов могут быть возможности, которых нет у суперкласса) Вы не можете сделать:

    A a = new B(); // invalid!
    
  3. Суперкласс может быть присвоен любой переменной соответствующего типа.

    A q = new A(); // sure, any variable q or otherwise...
    
  4. Класс может быть присвоен переменной типа одного из реализованных интерфейсов.

    C c = new A();
    
0 голосов
/ 03 февраля 2011

Да, обычно это основная идея: полиморфизм .

Допустим, у вас есть несколько фигур: круг, квадрат, треугольник.У вас будет:

class Shape { ... }

class Circle extends Shape { ... }

class Square extends Shape { ... }

class Triangle extends Shape { ... }

Идея наследования заключается в том, что Круг - это Форма.Таким образом, вы можете сделать:

Shape x = ...;
Point p = x.getCenterPosition();

Вам не нужно заботиться о том, к какому конкретному типу относится переменная x.

0 голосов
/ 03 февраля 2011

Может ли переменная подкласса быть приведена к любому из ее суперклассов?

Да

И может ли переменной суперкласса быть назначена любая переменная подкласса?

Да

Может ли суперкласс быть назначен какой-либо переменной?

Да

Если да, может ли интерфейспеременной присвоить переменную из любого реализующего класса?

Да

...