关于java:类继承的实例

Instance of a class inheritance

我目前正在学习java。我有一个关于继承的问题。
我知道您可以使用以下方法继承父类的变量:

1
2
public class ChildClass extends ParentClass{
}

但是,我想做一些事情,比如从 ParentClass 的实例继承变量和分配给它们的值。示例:我有一个类 Animal 和一个类 Dog 从 Animal 扩展。类动物有:

1
2
private int number_of_legs;
private int number_of_eyes;

此时我创建了一个动物类的新实例:

1
2
3
4
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 类 (first_animal) 的实例继承值。

1
Dog first_dog = new ??? // i tried with ...new first_animal.Dog but it didn't work.

谁能帮帮我?感谢您的宝贵时间。


这样就可以了:

1
Dog dog = new Dog(4, 2);

您不能将子类的实例创建为超类的实例。你可以说所有的Dog都是Animal,但并不是所有的Animal都是Dog

注意上面的语句意思是:

1
2
3
4
//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 在这里是错误的,因为这意味着您在 Animal 类中有一个 static class Dognew first_animal.Dog 在这里是错误的,因为这意味着您在 Animal 类中有一个内部类 Dog。这些是您不应该涵盖的不同主题。


您将值从子类的构造函数传递给超类的构造函数。

1
Dog firstDog = new Dog (4,2);

Dog 构造函数看起来像这样:

1
2
3
4
public Dog (int legs, int eyes)
{
   super (legs,eyes);
}

如果您希望从超类 Animal 的实例创建子类 Dog 的实例,您可以使用复制构造函数:

1
2
3
4
public Dog (Animal animal)
{
    super (animal.getLegs(), animal.getEyes());
}

然后你可以使用它:

1
Dog firstDog = new Dog (firstAnimal);


我相信我是带着你提出的同样问题来到这里的。在阅读了提供的答案并进一步思考之后,我意识到我需要做什么。

假设您有一个 Animals 数组,其中一个是 Dog。我想从 Animal[0] 实例中获取属性并构建一个 Pet.

您可以将 Animal[0] 传递给构建方法。

1
2
3
4
5
6
7
public Pet (Animal animal,String name){
     this.Legs = animal.Legs;
     this.Tail = animal.Tail;
     this.Species = animal.Species;
     etc....
     this.Name = name
}

因此,虽然 Pet 对象没有从 Animal 实例"继承"变量,但它会采用它的值。


首先,如果您需要在子类中重用它们,您应该将您的类 Animal 设为抽象并将其属性的范围设置为受保护而不是私有。要实例化 Animal,只需调用 Animal 的具体子类的构造函数(需要定义至少一个调用超类构造函数的构造函数作为其第一条语句)。


您不能创建"继承"自 Animal 类的特定实例的 Dog 实例。


您的第一个问题是您的实例字段在您的超类中被标记为 private。这将它们的范围限制在该类中,从任何子类中消除它们。如果您想将范围扩大到子类同时限制子类,请调用实例字段 protected.

您的第二个问题是,当实例已经具有类类型时,您不能初始化子类的新实例。然而,你可以做的是写:

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

你不继承 private 变量和方法。如果要继承它们,则必须更改对 protected.

的访问权限

一点关于OO和现实生活:每只狗都是动物——但不是每只动物都是狗,这意味着你可以这样做:

1
Animal animal = new Dog(4,2);

但你不能反之亦然:

1
Dog dog = new Animal(4,2); // compilation error