Родительский класс Java с использованием атрибутов дочернего класса

#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. Переменные вашего родительского класса должны быть общедоступными или защищенными для наследования, если вы явно не указываете, что они упакованы как частные, но общедоступные в пакете.