Рассмотрим этот ниже фрагмент кода
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();
}
}
Почему я не могу так? Что мешает мне написать это?
Почему я не могу так?
SubClass2
не является SubClass1
Что мешает мне написать это?
Вы не можете преобразовать типы в ссылки на Java. Вы можете изменить тип ссылки только на тот объект, который на самом деле находится. То, что вы, возможно,
SuperClass obj = new SubClass2(); // SubClass2 is a SuperClass
obj.move();
или вы могли бы
public class SubClass2 extends SubClass1 {
SubClass2
в SubClass1
автомагически. Это разные типы. В других языках, таких как C ++, вы можете предоставить метод преобразования, чтобы описать, как превратить SubClass1
в SubClass2
Поскольку SubClass2 расширяет SuperClass, а не SubClass1.
Например, предположим, что SubClass1 также содержит переменную-член x
и функцию y()
. Если вы можете отбросить из SubClass2 в SubClass1, переменная x
и функция y()
не будут существовать, и ваша программа завершится с ошибкой. Поэтому Java этого не допускает.
Два подкласса связаны только с классом (es), который они распространяют, а не друг с другом.
Потому что в полиморфизме вы не можете отнести одного брата к другому брату. Например, на рисунке ниже вы можете:
Bicycle b1 = new MountainBike();
Bicycle b2 = new RoadBike();
Bicycle b3 = new TandemBike();
потому что все они имеют общий суперкласс. Но MountainBike
, RoadBike
и TandemBike
не могут ссылаться друг на друга, так как они сиблируют.
Давайте возьмем пример из ООП. условием является родительский класс SuperClass как дочерних классов SubClass1, так и SubClass2.
Теперь в коде вы пытаетесь удерживать объект SubClass2 в ссылке SubClass1. Теперь, когда вы пытаетесь создать ссылку, она будет выглядеть ниже.
Теперь, когда вы смотрите на иерархические подклассы, есть отношение "родственный", а не "дочерний родитель", где; поскольку дочерний элемент выводится родителем, родитель может удерживать соответствующий дочерний объект. Но это не подразумевает, что у Siblings оба могут иметь свою собственную версию поведения и свойств (в противном случае может быть меньше других), если java разрешает или будет правильно говорить, что OOP позволяет брату вести себя как ваш код понятие "физическая проблема, реализованная программно", пойдет не так.
SubClass1 obj = new SubClass2()
?