Экземпляр наследования классов

1

В настоящее время я изучаю 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.

Может кто-нибудь мне помочь? Спасибо за ваше время.

Теги:
object
inheritance
instance

7 ответов

1
Лучший ответ

Это будет делать:

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. Это разные темы, которые вы еще не должны описывать.

1

Вы передаете значения из конструктора подкласса в конструктор суперкласса.

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);
  • 0
    Upvote для копирования конструктора.
  • 0
    @starf этот пример конструктора копирования - плохая идея. Это означает, что вы можете создать экземпляр Dog из любого Animal , например, Fly или Octopus , если только у вас нет домашнего животного осьминога :)
Показать ещё 2 комментария
0

Я верю, что пришел сюда с тем же вопросом, который вы задавали. Прочитав предоставленные ответы и подумав об этом, я понял, что мне нужно делать.

Скажем, у вас есть Массив 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, он будет принимать свои значения.

0

Вы не можете создать экземпляр Dog, который "наследует" от определенного экземпляра класса Animal.

0

Ваша первая проблема заключается в том, что ваши поля экземпляров помечены как private в вашем суперклассе. Это ограничивает их сферу действия этим классом, исключая их из любых подклассов. Если вы хотите расширить область подклассов, ограничив ее иначе, вызовите protected поля экземпляра.

Вторая проблема заключается в том, что вы не можете инициализировать новый экземпляр подкласса, когда экземпляр уже имеет тип класса. Однако вы можете написать:

Animal first_dog = new Dog(4, 2);
0

Во-первых, вы должны сделать свой класс Animal abstract и задать область его атрибутов для защиты вместо частного, если вам нужно повторно использовать их в подклассах. Чтобы создать экземпляр Animal, просто вызовите конструктор конкретного подкласса Animal (нужно определить хотя бы один конструктор, который вызывает в качестве первого оператора конструктор суперкласса).

  • 0
    Вам не нужно отмечать ваши классы как abstract а также не нужно отмечать все поля (атрибуты) как protected , чтобы включить наследование.
  • 0
    Я знаю, но в этом случае я бы использовал очевидную иерархию классов. Что будет означать животное среди кошек, собак и крыс? Для полей я указал, что это только для тех, кого он хочет повторно использовать в подклассах. Вы могли бы сказать, что он все еще может сделать это приватным и определить методы получения и установки, но в этом конкретном случае я не думаю, что это будет актуально, это только сделает код более многословным.
Показать ещё 3 комментария
0

Вы не наследуете private переменные и методы. Если вы хотите наследовать их, вы должны изменить доступ к protected.

Немного об ОО и реальной жизни: каждая собака - животное - но не каждое животное - собака, а это означает, что вы можете делать:

Animal animal = new Dog(4,2);

но вы не можете сделать наоборот:

Dog dog = new Animal(4,2); // compilation error
  • 0
    Можете ли вы объяснить немного дальше первое утверждение? Что именно делает код? животное животное или собака?
  • 0
    @ user3900065 на самом деле, я объяснил это вчера здесь
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню