类继承的实例

时间:2014-08-01 16:04:06

标签: java object inheritance instance

我目前正在学习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.

任何人都可以帮助我吗?谢谢你的时间。

7 个答案:

答案 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实例中的变量,但它将采用其值。