java - 声明 Java 对象但调用子类的构造函数
问题描述
想象一下有两个 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();
在更广泛的代码段中有用且有意义地使用。请。我会非常非常感谢它。
解决方案
这个概念被称为动态方法分派,通过使用这种运行时多态性(Overriding)在java中实现。
让我们扩展您编写的示例如下
class Dog{
public void bark(){
// parent class implementation
System.out.println("I bark");
}
}
在这里,我们定义了一个Dog
类,该类具有一个被调用的方法bark
并提供了它的实现。
假设Dog
有两个子类Poodle
,Chihuahua
如下所示。
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");
}
}
Poodle
和Chihuahua
类有其bark
方法的实现。
并且您创建了一个子对象并为其分配了父引用并调用 bark 方法,如下所示。
Dog dog1 = new Poodle();
dog1.bark(); //prints **I bark like Poodle**
在运行时,JVM 了解您有一个Poodle
Object 并检查是否Poodle
覆盖了 bark 方法,然后调用它。
当您执行以下操作时,可以在集合中观察到这种模式。
List<String> list = new ArrayList<>();
list.add("test string"); //this gets added according to ArrayList implementation.
推荐阅读
- angular - AgGrid Cell Renderer init() 函数在 onCellValueChanged() 上调用了两次,应该只调用一次
- android - Facebook 深度链接在 Android 上的错误行为
- java - 无法让android创建通知
- google-cloud-data-fusion - 创建系统计算配置文件
- rest - 下游验证失败时的 Http 状态码
- angular - 如何让不同的 MAT-TAB 共享相同的 HTML 代码
- spring - Hibernate 连接表在列问题上是唯一的
- python - 如何更新纯函数?
- java - Spring Boot,如何在具有 EmbeddedId 的表中插入新记录
- amazon-web-services - 从第三方获取数据到 EC2 是否被视为入站数据?