#java #inheritance
#java #наследование
Вопрос:
public animal{
String name;
String species;
public introduction(){
System.out.println("Hi, my name is" name ", i am a " species);
}
}
public dog extends animal{
String species = "dog";
}
Мне интересно, должен ли я создавать больше дочерних классов, таких как cat, bird и т. Д., С их уникальной species
переменной. Если есть способ, с помощью которого я могу заставить их самостоятельно вводить разные в зависимости от их вида?
Я понимаю, что прошу родительский класс получить доступ к атрибуту дочернего класса, что, по-видимому, в первую очередь противоречит цели наследования, но я не уверен, какой более элегантный способ сделать это.
Ответ №1:
Судя по вашему, animal.class
вы уже определили общедоступную переменную-член name
и species
. Очевидно, что это часть дочерних классов, а именно cat.class
и dog.class
Ваш родительский класс имеет синтаксические ошибки функция должна возвращать void
примерно так:
public void introduction(){
System.out.println("Hi, my name is" name ", i am a " species);
}
Ваши дочерние классы будут выглядеть следующим образом:
class Cat extends Animal{
public Cat(){
super.name = "tom"
super.species = "cat"
}
}
class Mouse extends Animal{
public Mouse(){
super.name = "jerry" //simply calling name = "jerry" will work as this is inherited.
super.species = "mouse"
}
}
Обратите внимание, что у меня нет переменных-членов дочернего уровня, и вы можете вызывать их следующим образом:
Animal cat = new Cat();
Animal mouse = new Mouse();
cat.introduction(); // prints Hi, my name is tom...
mouse.introduction(); //prints Hi, my name is jerry ...
Кроме того, хорошей практикой является следовать рекомендациям по программированию при использовании ваших классов. например (Animal вместо animal)
Комментарии:
1. Вам не нужен
super
конструктор. Поле уже унаследовано2. Я знаю, я предположил, что OP является новым для Java и не хотел путать его / ее
3. Я пытался использовать
this.name = "Tom"
amp;this.species = "cat"
, но не сработало; это потому, что ключевоеthis
слово по умолчанию присваивает значение атрибуту дочернего уровня? и использованиеsuper
присвоит значение родительскому атрибуту? Это правильно?4. Переменные вашего родительского класса должны быть общедоступными или защищенными для наследования, если вы явно не указываете, что они упакованы как частные, но общедоступные в пакете.