然而,我不确定我是否理解他的观点,因为根据我的理解,当我们有一个父类引用变量指向子类对象时,一个行为被认为是多态的(侧重于动态多态性)。
然后在运行时获取父类变量所指向的实际对象,并调用其方法,如这里所解释的那样。
但是,我没有在我的项目中使用上向转换(即用对象类变量初始化POJO类)。
因此,我的问题是--尽管父类(对象)从未用作引用变量,但重写toString()是否被视为多态性?
我在Stackoverflow上发现的运行时多态性的所有测试,包括这里的测试和这个带有toString的测试,都说明了一种情况,即我们有一个父类变量指向一个子类对象,例如:
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
上面是否考虑了多态性,尽管没有上浇/父引用变量涉及?
那么:方法重写对于多态性是否足够,还是需要有一个对子类对象的父类引用?在采访中,我可以肯定地说,仅仅重写toString()就是多态性的一个例子吗?
由于这些评论和一些其他来源,我相信我现在可以回答我的问题如下:
可以认为重写toString()是多态性的一个例子,因为:
Java虚拟机(JVM)总是根据它所引用的对象而不是变量类型定义的方法来选择要在非最终实例方法上调用的方法。这被称为动态方法调用或后期绑定,即在运行时决定调用哪个方法,因此出现了“运行时”多态性。来源:Oracle文档,JavaWorld。
因此,无论我们是否有意识地使用多态性,例如对接口进行编程,或者我们进行简单的toString()方法重写,但仍然继续使用我们的类和它们自己的类变量(即使用“user”变量而不是父类“object”变量),关于调用哪个方法的决定总是在运行时通过检查我们的变量引用的对象类型来做出的。
因此,无论我们使用两个初始化中的哪一个,都会对调用哪个模型(即polimorphic行为)进行计算:
User user = new User("username1");
System.out.println(user);
// or
Object object = new User("username1");
System.out.println(object);
对于我们的问题来说,变量的类型并不重要,重要的是它所引用的对象,以及它所引用的所有可能的对象中的哪一个(即父对象或子对象)是在运行时决定的。
例如,如果我们向用户类添加了一个新方法:
public String instanceMethod () {
return "User instance method called";
}
它不能通过对象类变量使用:
它只能通过User类变量使用。
我刚刚注意到javadoc状态(强调为我的): 返回声明中包含的此枚举常量的名称。该方法可能被重写,尽管它通常不是必需的或不需要的。当存在更“程序员友好”的字符串窗体时,枚举类型应重写此方法。 默认情况下,和返回相同的内容,因此即使被重写,仍然可以通过方法访问枚举的名称。 编辑:供参考,的javadoc(强调与原文相同): 返回此枚举常量的名称,与在其枚举声明中声明的名称完全相同。大多数程序员应该
编译器必须为constexpr的不同路径生成多个函数,这取决于函数的调用方式。所以也许它在使用过载分辨率。 被接受的建议没有提到“sfinae”或“过载分辨率”。 所以我很好奇这两个概念是否适用于“constexpr if”。
首先让我说,“记录器”是指任何一类负责向用户或程序员报告诊断或进度信息的对象。根据这个定义,“记录器”将包括图形用户界面上的反馈,如进度条。 我们一再被告知要避免全局状态,尤其是全局可变状态(GMS)。因为伐木者天生是可变的,所以我最近试图让我的伐木者“不是全球性的”。我尝试了各种策略(比如通过构造函数向记录器注入引用)。我终于意识到,所有的方法都是把口红贴在猪身上。 日志记录器必须是所有类(或至
最近在一次采访中,我被问到,“Java中的动态多态性示例是什么?” 我回答:“方法覆盖”。 然后,面试官问:“是否有任何压倒一切的概念不属于动态多态性?” 这真的是个好问题吗?如果是,答案是什么? 提前感谢。
我们有两个班级。 我试图弄清楚函数 是否会被视为或。我尝试使用关键字,它说该方法未被覆盖。但我想知道 关键字是否仅在父类中的函数被编写为函数时才有效,并且在上述情况下是否可以将该函数视为被覆盖。 另外,我想知道重写方法是否总是意味着后期绑定/运行时多态?
我有一个父组件,它有许多子组件(子组件是一个带有彩色背景的空div)。 我想改变孩子的颜色,但要确保我正在使它变成一个不同的颜色比它已经是-例如,如果孩子是蓝色的,我想改变它到另一个颜色,不是蓝色。 为此,我使用一个道具来设置初始颜色,并将此道具保存到孩子的状态。 当我点击div更改颜色时,我想访问div的当前颜色,以便我可以将其从选择中排除,当然可以从中进行选择 1)这被认为是可以做的反应吗?2