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); |
您不能将子类的实例创建为超类的实例。你可以说所有的
注意上面的语句意思是:
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); |
您将值从子类的构造函数传递给超类的构造函数。
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); |
我相信我是带着你提出的同样问题来到这里的。在阅读了提供的答案并进一步思考之后,我意识到我需要做什么。
假设您有一个
您可以将
1 2 3 4 5 6 7 |
因此,虽然 Pet 对象没有从 Animal 实例"继承"变量,但它会采用它的值。
首先,如果您需要在子类中重用它们,您应该将您的类 Animal 设为抽象并将其属性的范围设置为受保护而不是私有。要实例化 Animal,只需调用 Animal 的具体子类的构造函数(需要定义至少一个调用超类构造函数的构造函数作为其第一条语句)。
您不能创建"继承"自 Animal 类的特定实例的 Dog 实例。
您的第一个问题是您的实例字段在您的超类中被标记为
您的第二个问题是,当实例已经具有类类型时,您不能初始化子类的新实例。然而,你可以做的是写:
1 | Animal first_dog = new Dog(4, 2); |
你不继承
的访问权限
一点关于OO和现实生活:每只狗都是动物——但不是每只动物都是狗,这意味着你可以这样做:
1 | Animal animal = new Dog(4,2); |
但你不能反之亦然:
1 | Dog dog = new Animal(4,2); // compilation error |