В настоящее время я изучаю java. У меня вопрос о наследовании. Я знаю, что вы можете наследовать переменные родительского класса, используя:
public class ChildClass extends ParentClass{
}
Тем не менее, я хотел сделать что-то вроде наследования переменных и значений, назначенных им из экземпляра ParentClass. Пример: у меня есть класс Animal и класс Dog, простирающийся от Animal. Классное животное имеет:
private int number_of_legs;
private int number_of_eyes;
В этот момент я создаю новый экземпляр класса животных:
Animal first_animal = new Animal(4,2);
/*where 4 and 2 are the number of legs and eyes which
*i attribute through a constructor present in Animal.
*/
Теперь я хочу создать новый экземпляр класса Dog, который наследует значения из экземпляра класса Animal i, только что созданного (first_animal).
Dog first_dog = new ??? // i tried with ...new first_animal.Dog but it didn't work.
Может кто-нибудь мне помочь? Спасибо за ваше время.
Это будет делать:
Dog dog = new Dog(4, 2);
Вы не можете создать экземпляр подкласса в качестве экземпляра суперкласса. Вы можете сказать, что все Dog
- Animal
, но не все Animal
- Dog
.
Обратите внимание, что приведенное выше утверждение означает:
//valid and accepted because one kind of instance of animal is a dog
Animal dog = new Dog(4, 2);
//invalid and throws a compiler error because one kind of instance of a Dog cannot be any animal
Dog anotherDog = new Animal(4, 2);
new Animal.Dog
здесь не так, потому что это означает, что у вас есть static class Dog
внутри класса Animal
. new first_animal.Dog
здесь не так, потому что это означает, что у вас есть внутренний класс Dog
внутри класса Animal
. Это разные темы, которые вы еще не должны описывать.
Вы передаете значения из конструктора подкласса в конструктор суперкласса.
Dog firstDog = new Dog (4,2);
Конструктор Dog будет выглядеть так:
public Dog (int legs, int eyes)
{
super (legs,eyes);
}
Если вы хотите создать экземпляр подкласса Dog из экземпляра суперкласса Animal, вы можете использовать конструктор копирования:
public Dog (Animal animal)
{
super (animal.getLegs(), animal.getEyes());
}
Затем вы можете использовать его с:
Dog firstDog = new Dog (firstAnimal);
Я верю, что пришел сюда с тем же вопросом, который вы задавали. Прочитав предоставленные ответы и подумав об этом, я понял, что мне нужно делать.
Скажем, у вас есть Массив Animals
, одним из которых является Собака. Я хочу взять атрибуты из экземпляра Animal[0]
и создать Pet
.
Вы передадите Animal[0]
в метод сборки.
public Pet (Animal animal,String name){
this.Legs = animal.Legs;
this.Tail = animal.Tail;
this.Species = animal.Species;
etc....
this.Name = name
}
Поэтому, пока объект Pet не "наследует" переменные из экземпляра Animal, он будет принимать свои значения.
Вы не можете создать экземпляр Dog, который "наследует" от определенного экземпляра класса Animal.
Ваша первая проблема заключается в том, что ваши поля экземпляров помечены как private
в вашем суперклассе. Это ограничивает их сферу действия этим классом, исключая их из любых подклассов. Если вы хотите расширить область подклассов, ограничив ее иначе, вызовите protected
поля экземпляра.
Вторая проблема заключается в том, что вы не можете инициализировать новый экземпляр подкласса, когда экземпляр уже имеет тип класса. Однако вы можете написать:
Animal first_dog = new Dog(4, 2);
Во-первых, вы должны сделать свой класс Animal abstract и задать область его атрибутов для защиты вместо частного, если вам нужно повторно использовать их в подклассах. Чтобы создать экземпляр Animal, просто вызовите конструктор конкретного подкласса Animal (нужно определить хотя бы один конструктор, который вызывает в качестве первого оператора конструктор суперкласса).
abstract
а также не нужно отмечать все поля (атрибуты) как protected
, чтобы включить наследование.
Вы не наследуете private
переменные и методы. Если вы хотите наследовать их, вы должны изменить доступ к protected
.
Немного об ОО и реальной жизни: каждая собака - животное - но не каждое животное - собака, а это означает, что вы можете делать:
Animal animal = new Dog(4,2);
но вы не можете сделать наоборот:
Dog dog = new Animal(4,2); // compilation error
Dog
из любогоAnimal
, например,Fly
илиOctopus
, если только у вас нет домашнего животного осьминога :)