覆盖toString()是否被视为多态性?

问题描述 投票:3回答:1

我今天正在用Java进行考试,考官问我是否可以在Spring Boot项目中提供使用多态的任何示例。

[起初我什么都没想到,他指出我已经在模型中覆盖了[[toString(),这是动态/运行时多态性。

但是,我不确定我是否理解他的观点,因为据我所知,当我们具有

指向子类对象的父类参考变量(专注于动态多态)时,行为被视为多态的。然后在运行时获取父类变量指向的实际对象,并调用其方法,如here很好地解释。

但是,我没有在项目中使用向上转换(即,使用Object类变量初始化POJO类)。

因此,我的问题是-

尽管父类(Object)从未用作引用变量,但是重写toString()被视为多态性吗?

[我在Stackoverflow上找到的所有运行时多态示例,包括带有toString的herethis,说明了我们有一个指向子类对象的父类变量,例如:

Object object = new User("petar"); String name = object.toString(); // assign to variable for clarity`s sake System.out.println(name); // prints petar

我的用户类别是:

public class User { String name; public User(String name) { this.name = name; } public String toString() { return name; } }

但是,在我的项目中,我只是使用自己的参考变量来创建用户和其他POJO类,例如:

User user = new User("petar"); String name = user.toString(); System.out.println(name); // prints petar, as toString is overriden

以上是否考虑了多态性,尽管没有涉及上调/父参考变量?

我的同学认为是这样,因为对于

非最终实例方法

,编译器不知道要调用哪个方法-它仅确保超类中存在该方法,因此会延长此决定直到运行时(late binding),方法是将一条指令插入已编译的代码中,然后对其进行检查,然后提取该变量指向的实际对象,并调用其方法(source)。
但是,在this article中指出:

方法重写是运行时多态性的一个示例。当,因为在方法调用期间将执行哪个方法(父类或子类)由对象的类型决定。该过程在其中调用覆盖的方法在运行时被解析为动态方法派遣。

所以:方法重写是否足以实现多态性,还是要求对子类对象有父类引用?我在采访中可以肯定地说,仅重写toString()是多态的一个例子吗?

我今天正在用Java进行考试,考官问我是否可以在Spring Boot项目中提供使用多态的任何示例。起初我什么都没想到,他指出...

java polymorphism overriding late-binding upcasting
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.