2017-02-15 13 views
0

Предположим следующие классы существуют:Функциональность расширения класса в Java

public class A { 

    public void whatAreYou() { 
    System.out.println("A"); 
    } 
} 

___________________________ 

public class B extends A { 

    public void whatAreYou() { 
    System.out.println("B"); 
    } 
} 

Теперь мы инициализировать и б следующим образом:

A b = new B(); 
b.whatAreYou(); 

_______________ 

B a = new A(); 
a.whatAreYou(); 

Вопрос: Есть ли у этих программ работать без ошибок? Если нет, то чего не может быть ошибок?

Мое мнение:

Я думаю, что первая программа должна работать нормально, так как класс B является расширением класса А. Но я не могу сказать, какой тип объекта мы имеем здесь. Имеет ли он все атрибуты B тоже? Кроме того, он должен печатать «B».

Вторая программа не работает, но мне не хватает четкого объяснения.

Может ли кто-нибудь помочь мне?

+1

Что происходит, когда вы пытаетесь скомпилировать это? Вторая программа «не работает» - какие сообщения об ошибках компилятор дает вам? Прочитайте их критически. –

+2

A не является B. Каждая собака является животным, но не каждое животное является собакой. Вы не можете просить кошек кошки лаять –

+0

Возможный дубликат [Java: разница между A x = new A() и A x = new B(), когда B расширяет A] (http://stackoverflow.com/questions/13077009/java-difference-between-ax-new-a-and-ax-new-b-when-b-extends-a) –

ответ

0

Помещение вашего кода в IDE, безусловно, поможет, поскольку вы можете использовать отладчик, чтобы увидеть, что происходит шаг за шагом. Вы также сможете увидеть ошибку времени компиляции для 'B a = new A();' и идти оттуда. Что касается функциональности классов, в этом случае B является переопределением метода whatAreYou(). Это можно сделать с помощью аннотации @Override.