我目前正在学习java。我有关于继承的问题。 我知道你可以使用:
继承父类的变量public class ChildClass extends ParentClass{
}
但是,我想做一些事情,比如从ParentClass的实例继承变量和赋值给它们的值。示例:我有一个Animal类和一个从Animal扩展的类Dog。阶级动物有:
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类(first_animal)实例的值。
Dog first_dog = new ??? // i tried with ...new first_animal.Dog but it didn't work.
任何人都可以帮助我吗?谢谢你的时间。
答案 0 :(得分:1)
将值从子类的构造函数传递给超类的构造函数。
Dog firstDog = new Dog (4,2);
Dog构造函数看起来像这样:
public Dog (int legs, int eyes)
{
super (legs,eyes);
}
如果您希望从超类Animal的实例创建子类Dog的实例,则可以使用复制构造函数:
public Dog (Animal animal)
{
super (animal.getLegs(), animal.getEyes());
}
然后你可以用它:
Dog firstDog = new Dog (firstAnimal);
答案 1 :(得分:1)
这样做:
Dog dog = new Dog(4, 2);
您不能将子类的实例创建为超类的实例。您可以说所有Dog
都是Animal
s,但并非所有Animal
都是Dog
s。
请注意,上述声明表示:
//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
。这些是不同的主题,您不应该涵盖 。
答案 2 :(得分:0)
您不会继承private
变量和方法。如果要继承它们,则必须更改protected
的访问权限。
关于OO和真实的生活:每条狗都是动物 - 但不是每只动物都是狗,这意味着你可以做:
Animal animal = new Dog(4,2);
但你反之亦然:
Dog dog = new Animal(4,2); // compilation error
答案 3 :(得分:0)
您的第一个问题是您的实例字段在超类中标记为private
。这会将它们的范围限制为该类,从而将它们从任何子类中删除。如果您希望将范围扩展到子类,同时限制它,请调用实例字段protected
。
您的第二个问题是,当实例已经具有类类型时,您无法初始化子类的新实例。但是,你可以做的是写:
Animal first_dog = new Dog(4, 2);
答案 4 :(得分:0)
您无法创建Dog的实例,该实例从类Animal的特定实例“继承”。
答案 5 :(得分:0)
首先,如果需要在子类中重复使用它们,则应该使您的类为Animal抽象并将其属性的范围设置为protected而不是private。要实例化Animal,只需调用Animal的具体子类的构造函数(需要定义至少一个调用超类构造函数的构造函数作为其第一个语句)。
答案 6 :(得分: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实例中的变量,但它将采用其值。