Java 类继承的实例

Java 类继承的实例,java,object,inheritance,instance,Java,Object,Inheritance,Instance,我目前正在学习java。我有一个关于继承的问题。 我知道您可以使用以下方法继承父类的变量: public class ChildClass extends ParentClass{ } 但是,我想做一些事情,比如从父类的实例继承变量和分配给它们的值。我有一个班动物和一个班狗从动物延伸而来。该类动物有: private int number_of_legs; private int number_of_eyes; 此时,我创建了类animal的一个新实例: Animal first_anima

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

public class ChildClass extends ParentClass{
}
但是,我想做一些事情,比如从父类的实例继承变量和分配给它们的值。我有一个班动物和一个班狗从动物延伸而来。该类动物有:

private int number_of_legs;
private int number_of_eyes;
此时,我创建了类animal的一个新实例:

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 firstDog = new Dog (4,2);
Dog构造函数将如下所示:

public Dog (int legs, int eyes) 
{
   super (legs,eyes);
}
如果您希望从超类动物的实例创建子类狗的实例,可以使用复制构造函数:

public Dog (Animal animal) 
{
    super (animal.getLegs(), animal.getEyes());
}
然后,您可以将其用于:

Dog firstDog = new Dog (firstAnimal);

您不会继承
private
变量和方法。如果要继承它们,则必须将访问权限更改为
protected

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

但你不能反过来做:

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

第一个问题是实例字段在超类中标记为
private
。这将它们的作用域限制在该类中,从而将它们从任何子类中删除。如果要将作用域扩展到子类,同时对其进行其他限制,请调用实例字段
protected

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

Animal first_dog = new Dog(4, 2);
这将有助于:

Dog dog = new Dog(4, 2);
不能将子类的实例创建为超类的实例。你可以说所有的
Dog
s都是
Animal
s,但不是所有的
Animal
s都是
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
在这里是错误的,因为它意味着在
Animal
类中有一个
静态类Dog
newfirst\u animal.Dog
在这里是错误的,因为它意味着你有一个内部类
Dog
内部
animal
类。这些是不同的主题,您不应该涵盖

您不能创建“继承”类动物特定实例的Dog实例

首先,如果需要在子类中重复使用,应该将类动物抽象化,并将其属性的范围设置为protected而不是private。要实例化一个动物,只需调用动物的一个具体子类的构造函数(需要定义至少一个调用超类构造函数的构造函数作为其第一个语句)。

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

假设你有一组动物,其中一只是狗。我想从
Animal[0]
实例中获取属性,并构建一个
Pet

Animal[0]
传递到build方法中

public Pet (Animal animal,String name){
     this.Legs = animal.Legs;
     this.Tail = animal.Tail;
     this.Species = animal.Species;
     etc....
     this.Name = name
}

因此,虽然Pet对象不是从Animal实例“继承”变量,但它将接受其值。

您不需要将类标记为
抽象
,也不需要将所有字段(属性)标记为
受保护
,以启用继承。我知道,但在这种情况下,我会使用明显的类层次结构。猫、狗和老鼠中间的动物是什么意思?对于字段,我指定它仅适用于他希望在子类中重复使用的字段。你可以说他仍然可以让它私有化,定义getter和setter,但在这种特殊情况下,我不认为这是相关的,它只会使代码更加冗长。好吧,如果你这么理论化,那么一个未被发现的动物呢?它是一种动物,但你不知道它属于哪一种,但它仍然是一种动物:)它有点牵强,不是吗?我不想争论几个小时,让它抽象还是不抽象更好,让我们说,在90%的情况下,这是动物类的自然选择。由于这是在抽象超类中分解构造函数和属性的一种非常常见的做法,所以我认为最好提一下。在90%的情况下,这是动物类的自然选择。不,你完全错了。事实上,除非有具体的理由,否则不应该将类抽象化。我在你的帖子或评论中找不到使其抽象化的具体原因,所以就让它保持原样吧。@starf这个复制构造函数的例子是个坏主意。这意味着你可以从任何
动物
创建一个
实例,比如
苍蝇
章鱼
,除非你有一只章鱼狗宠物:)@luigimendoza我理解你的例子:),但这肯定回答了最初的问题,因为苍蝇是一种动物,章鱼是一种动物吗?@starf By:Octopus(/ˈktəpʊs/或/ˈktəpəs/;复数:章鱼、章鱼或章鱼;见下文)是章鱼目的头足类软体动物。。它与:软体动物或软体动物[注1]/ˈmɒləsks/组成称为软体动物的大型无脊椎动物门有关。。是的,章鱼是动物:)你能进一步解释一下第一句话吗?代码到底是做什么的?动物是动物还是狗?@user3900065事实上,我昨天解释过了
//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);
public Pet (Animal animal,String name){
     this.Legs = animal.Legs;
     this.Tail = animal.Tail;
     this.Species = animal.Species;
     etc....
     this.Name = name
}