2015-03-30 3 views
1

Рассмотрим это ниже фрагмент кодаТипичные Иерархическое наследование в Java

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() 'делать? – Radiodef

+0

@Radiodef Это вопрос, который я недавно встретил. Я знаю, что мы можем сделать SuperClass obj = новый SubClass2(); и вызывать метод move() подкласса2, подобный этому obj.move(); Но не мог ответить, почему я не могу сделать, как SubClass1 obj = new SubClass2() ?? –

ответ

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 расширяет суперкласс не SubClass1.

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

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

1

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

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

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

enter image description here

0

Давайте возьмем пример из объектно-ориентированного программирования. условием является родительский класс SuperClass как дочерних классов SubClass1 & SubClass2.

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

enter image description here

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

Смежные вопросы