繁体   English   中英

声明一个Java对象但调用子类的构造函数

[英]Declaring a Java object but calling the constructor of a child class

假设有两个 Java 类,Dog 和 Poodle。 Poodle 类扩展了 Dog 类。

创建这些类的实例时,这是常见的语法:

Dog myDog = new Dog();
Poodle myPoodle = new Poodle();

我不明白当您创建父类类型的对象然后调用子类构造函数时发生了什么,如下所示:

Dog myDog = new Poodle();

如果 myDog 是一个 Dog 类,我们为什么要调用它的一个子类的构造函数,这意味着什么? 为什么不创建一个子类(贵宾犬)类型的对象?

换句话说,我不知道这句话是什么意思:“我要创建一个 Dog 类型的对象,但我要调用它的一个子类的构造函数,即使这个对象不是子类类型”。

我无法理解这意味着什么。 请帮助我了解这里发生了什么。

编辑- 链接的重复问题确实似乎在问同样的问题。 令人沮丧的是,该页面上两个最受好评的答案并没有提供一个明确的例子,说明如何有意义地使用提问者特别询问的代码段:

Parent parent = new Child();

我理解并遵循了链接的重复问题上两个最受好评的答案提供的所有代码段。 我什至明白多态发生的地方。 但是这两个答案都没有使用问题中特别提到的代码行。 如果有人能告诉我一个例子,我真的非常感激

Parent parent = new Child();

在更广泛的代码段中有用且有意义地使用。 请。 我真的,真的很感激。

这个概念叫做动态方法分派,通过使用这个运行时多态性(覆盖)在java中实现。

让我们扩展你写的例子如下

class Dog{

public void bark(){
// parent class implementation
System.out.println("I bark");
}

}

这里我们定义了一个Dog类,它有一个叫做bark的方法并提供它的实现。

假设Dog有两个子类: PoodleChihuahua ,如下所示。

class Poodle extends Dog{

@Override
public void bark(){
//Poodle implementation
System.out.println("I bark like Poodle");
}
}

class Chihuahua extends Dog{

@Override
public void bark(){
//Chihuahua implementation
System.out.println("I bark like Chihuahua");
}
}

PoodleChihuahua类都有bark方法的实现。

并且您创建了一个子对象并为其分配了一个父引用并调用 bark 方法,如下所示。

Dog dog1 = new Poodle();
dog1.bark(); //prints **I bark like Poodle**

在运行时 JVM 知道您有一个Poodle对象并检查Poodle覆盖了 bark 方法然后调用它。

当您执行以下操作时,可以在 Collections 中观察到这种模式。

List<String> list = new ArrayList<>();
list.add("test string"); //this gets added according to ArrayList implementation.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM