首页 > 解决方案 > 声明 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();

在更广泛的代码段中有用且有意义地使用。请。我会非常非常感谢它。

标签: javaclassobject

解决方案


这个概念被称为动态方法分派,通过使用这种运行时多态性(Overriding)在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 了解您有一个PoodleObject 并检查是否Poodle覆盖了 bark 方法,然后调用它。

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

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

推荐阅读