2016-03-11 3 views
2

У меня есть два класса животных и собак. Как вы можете просить собаку простираться от животного. Я могу написать эти классы без проблем, но я заметил, что я могу создать новый объект собаки, как это:Объект Java hold с классом суперкласса объекта

Dog firstDog = new Dog("rocky"); 

Это нормально, но когда я пытаюсь создать новый экземпляр, как это:

Animal secondDog = new Dog("alex"); 

Нет никаких ошибок, но я не могу получить никаких полей или методов, которые я написал в классе Dog, даже если они являются общедоступными, поэтому, если я хочу сохранить объект в переменной, тип которой совпадает с типом суперкласса, я могу область охвата и методы, которые реализуют только этот суперкласс (для этого примера имя, цвет, setColor() и toString()), и нет никакого способа достичь полей и методов, которые реализованы в s ubclass. Правильно ли я понял, когда я пытаюсь вызвать функцию toString() функции secondDog, она вызывает метод, который я написал в классе Dog, я знаю, что переопределяю эту функцию в классе Dog, но я не могу использовать другие методы, которые я реализовал в классе Dog , Как java справляется с этим?

животных Класс:

public class Animal { 
    private String name; 
    private String color; 

    public Animal(String name){ 
     this.name=name; 
    } 

    public void setColor(String color){ 
     this.color=color; 
    } 

    public String toString(){ 
     return"Hi, my name is " + this.name + ". I'm " + this.color; 
    } 
} 

Dog Класс:

public class Dog extends Animal { 
    private int age; 
    public Dog(String name){ 
     super(name); 
     setColor("gray"); 
     this.age = 7; 
    } 
    public String speakDog(){ 
     return"wof!"; 
    } 
    public String toString(){ 
     return super.toString() + " and I " + speakDog(); 
    } 
} 
+0

Возможного дубликата [Может родитель Java вызов переопределить метод в других объектах, но не подтип?] (HTTP: // StackOverflow. ком/вопросы/1032847/может-ява-колл-родитель-переопределен-метод-в-других-объектов, но-не-подтипа); http://stackoverflow.com/questions/10985223/java-polymorphism –

ответ

7

Когда вы пишете это:

Animal secondDog = new Dog("alex"); 

Вы рассказываете Java secondDog является Animal, и это было его. Причина, по которой вам разрешено назначать Dog, и Animal ссылается на то, что Dog является подклассом Animal, поэтому он разрешен.

Однако secondDog, будучи явно животными, сможет получить доступ к свойствам и поведениям от класса Animal.

Чтобы получить доступ к свойствам и поведения Dog, вы должны бросить его:

((Dog)secondDog).speakDog(); 

Casting его Dog, как говорил Java: «Эй, поверьте мне, этот объект является собака.».

Только будучи более конкретным сейчас, вы можете получить доступ к свойствам Собаки. (Если нет, он по-прежнему рассматривается как Animal (более высокий класс)).

Однако, если вы отдали его классу, который не является подклассом Animal, вы получите ClassCastException.


В сущности,

  • если secondDog оставался Animal (не отлиты в Dog), он может получить доступ только все не закрытые поля и методы из Animal.

  • если secondDog отлили в Dog, он может получить доступ ко всем наследуемые поля и методы из Animalплюс все не частные поля и методы из Dog.

+0

Да, я понимаю. Я могу получить доступ только ко всем не закрытым полям и методам из Animal, когда я не бросил на Dog. Но если я переопределю один из этих методов в классе Dog, я получу переопределение в правой функции в главной функции? – azuosxela

+0

@azuosxela Вы правы, это метод переопределяется, вы будете вызывать переопределенный метод в подклассе. Например, если вы используете System.out.println (secondDog); (даже без его литья), он будет вызывать 'toString()' из класса 'Dog'. – user3437460

0

Cast объект животного, чтобы показать его собака

Dog secondDog = (Dog) new Animal("alex); 

Взгляните на это:

Animal a = new Dog(); 
Dog d = (Dog) a; // no problem, the type animal can be casted to a dog, because its a dog 
Cat c = (Dog) a; // raises class cast exception, you cant cast a dog to a cat 

только бросить, если это подкласс.

+2

При всем уважении; это полная бессмыслица. Дело в том, что вы говорите компилятору java, что тип secondDog - Animal. И животное - это животное; а не собакой. Дополнительный бросок ничего не меняет (в этом контексте). Конечно, когда вы знаете, что ваше животное - собака, вы можете бросить животных на собаку; и использовать собачьи методы. Но это не то, что делает ваш код. – GhostCat

1

Нет, невозможно получить доступ к свойствам Собаки через класс Animal. Рассмотрим базовый объект «Объект», из которого вытекает много подклассов. Вы можете сказать JFrame frame = new JFrame (""); или Объект objFrame = новый JFrame (""); рама. ??? предоставит вам доступ ко всем свойствам JFrame objFrame. ??? предоставит вам доступ к свойствам объекта.

стесняется спросить, почему secondDog должен быть создан как для животных, а не собака :)