为什么可以在Java中将超类初始化为子类?

Jor*_*der 7 java oop inheritance

简而言之,这是如何以及为什么可能:

Object obj=new MyClass();
Run Code Online (Sandbox Code Playgroud)

Object是所有对象的超类,因此MyClass是Object的子类.通常,在Java中,为什么可以在父类中使用子类的构造函数?


我理解它是如何反过来的,因为子类具有父类的所有变量/方法,所以当你初始化它们时,你只是初始化在父构造函数中指定的变量,它在子节点中按照定义存在.问题是,当你走另一条路时,它不一定是真的.一个子节点可以有父节点不具有的变量,那么如果父节点首先没有变量,那么如何将子构造函数与父节点一起使用呢?


该功能在开发中有什么用途?我认为如果你想要一个B类的实例,你会把它声明为B thing = new B(),而不是A thing = new B().这可能是我缺乏经验的谈话,所以我很感激启发为什么以及如何将父类初始化为其子女之一.

ant*_*nio 7

为什么可以在父类中使用子类的构造函数?

这是不正确的.当你这样做

Object obj = new MyClass();
Run Code Online (Sandbox Code Playgroud)

Object obj;声明类型的引用Objectnew MyClass();返回对其创建的对象的引用.

因此,您正在实例化a MyClass并将对创建的对象的引用分配给该类型的引用Object,这是可能的,因为它MyClass是一个Object.

正如你所说,

孩子可以拥有父母没有的变量

这称为扩展父功能(继承).

对于您的第二个问题,请考虑一个经典Animal示例:假设您创建了一个Animal类,并makeSound()在其上创建了一个方法.

现在,您创建的两个子类Animal,Dog并且Cat,它覆盖makeSound()的方法Animal(一Dog树皮和Cat叫声).

想象一下,你使用a 代表一个充满Animals(Dogs和Cats)的房间List,你想要制作所有这些房间makeSound().您的列表将被声明为List<Animal>因为您不知道Animal将要存储的s 类型.

然后你迭代List调用makeSound()每个Animal.无论Animal是a Dog还是a Cat,它都会发出声音.

然后想象你想要添加Birds List.容易,不是吗?