Типичное иерархическое наследование в Java

1

Рассмотрим этот ниже фрагмент кода

public class SuperClass {
    public void move()
    {
        System.out.println("i am in super class");
    }
}
public class SubClass1 extends SuperClass{
    public void move()
    {
        System.out.println("i am in sub1 class");
    }

}
public class SubClass2  extends SuperClass {

    public void move()
    {
        System.out.println("i am in sub2 class");
    }

}

Теперь я создаю такой объект.

public class program {
    public static void main(String[] args) {    
            SubClass1 obj = new SubClass2(); // Compile error - Type mismatch: cannot convert from SubClass2 to SubClass1
            obj.move();
    }
}

Почему я не могу так? Что мешает мне написать это?

  • 0
    Что вы ожидаете от SubClass1 obj = new SubClass2() ?
  • 0
    @Radiodef Это вопрос, с которым я недавно столкнулся. я знаю, что мы можем сделать SuperClass obj = new SubClass2 (); и вызвать метод move () для подкласса2 следующим образом: obj.move (); Но не могу ответить, как, почему я не могу сделать как SubClass1 obj = new SubClass2 () ??
Теги:
inheritance

4 ответа

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

Почему я не могу так?

SubClass2 не является SubClass1

Что мешает мне написать это?

Вы не можете преобразовать типы в ссылки на Java. Вы можете изменить тип ссылки только на тот объект, который на самом деле находится. То, что вы, возможно,

SuperClass obj = new SubClass2(); // SubClass2 is a SuperClass 
obj.move();

или вы могли бы

public class SubClass2  extends SubClass1 {
  • 0
    Можете ли вы объяснить, что вы хотите сказать "не может на самом деле конвертировать типы в ссылки в Java" в этом коде?
  • 0
    Вы не можете преобразовать тип как SubClass2 в SubClass1 автомагически. Это разные типы. В других языках, таких как C ++, вы можете предоставить метод преобразования, чтобы описать, как превратить SubClass1 в SubClass2
2

Поскольку SubClass2 расширяет SuperClass, а не SubClass1.

Например, предположим, что SubClass1 также содержит переменную-член x и функцию y(). Если вы можете отбросить из SubClass2 в SubClass1, переменная x и функция y() не будут существовать, и ваша программа завершится с ошибкой. Поэтому Java этого не допускает.

Два подкласса связаны только с классом (es), который они распространяют, а не друг с другом.

1

Потому что в полиморфизме вы не можете отнести одного брата к другому брату. Например, на рисунке ниже вы можете:

Bicycle b1 = new MountainBike();
Bicycle b2 = new RoadBike();
Bicycle b3 = new TandemBike();

потому что все они имеют общий суперкласс. Но MountainBike, RoadBike и TandemBike не могут ссылаться друг на друга, так как они сиблируют.

Изображение 174551

0

Давайте возьмем пример из ООП. условием является родительский класс SuperClass как дочерних классов SubClass1, так и SubClass2.

Теперь в коде вы пытаетесь удерживать объект SubClass2 в ссылке SubClass1. Теперь, когда вы пытаетесь создать ссылку, она будет выглядеть ниже.

Изображение 174551

Теперь, когда вы смотрите на иерархические подклассы, есть отношение "родственный", а не "дочерний родитель", где; поскольку дочерний элемент выводится родителем, родитель может удерживать соответствующий дочерний объект. Но это не подразумевает, что у Siblings оба могут иметь свою собственную версию поведения и свойств (в противном случае может быть меньше других), если java разрешает или будет правильно говорить, что OOP позволяет брату вести себя как ваш код понятие "физическая проблема, реализованная программно", пойдет не так.

Ещё вопросы

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