gpt4 book ai didi

java - 为什么 equals 不使用强制转换的 equals 方法?

转载 作者:行者123 更新时间:2023-12-01 08:08:26 27 4
gpt4 key购买 nike

正如问题所述。理想情况下,答案应该是 false,因为它将使用 Object#equal,这只是引用比较。

    String cat = new String("cat");
String cat2 = new String("cat");

System.out.println(((Object) cat).equals((Object) cat2)); // returns true, but should be false

这与多态性有关;我知道 equals() 和实习是如何工作的。

相关主题:类型转换图形 -> GRAPHICS2D

上述场景是向上转换的情况,其中 String 向下转换为 Object。

但是,它的常见用途实际上是向下转换 GraphicsGraphics2D 以使用 Graphics 中不存在的升级或新方法本身。为什么我们可以向上而不是向下。

import java.awt.*;
import javax.swing.*;

public class Example extends JPanel {
public static void main (String []args){
JFrame frame = new JFrame();
}
public void paintComponent(Graphics g){
Graphics2D g2 = (Graphics2D) g; // How can we be sure the informal
g2.drawLine(0,0, getWidth(), getHeight()); // parameter contains those methods?
}
}

最佳答案

您将 cat 转换为 Object,但这并没有改变 catString 的事实实例。 Java执行dynamic binding (又名后期绑定(bind)),这意味着方法调用在运行时根据对象作为实例的类来解析。在本例中,它仍然是 String,这意味着将使用 String#equals()而不是 Object#equals()。事实上,将 cat2 转换为 Object 几乎没有什么区别 - equals() 无论如何都会接受 Object 参数。

这是向自己证明这一点的简单方法:

String s = "abc";
Object o = (Object) s; // we don't really need an explicit cast

System.out.println(s.getClass());
System.out.println(o.getClass());
class java.lang.Stringclass java.lang.String

The same principle is at work here. o is of type Object but it is a String instance, and so String's getClass() is called.


Consider the following class structure:

class A {
public void foo() {
System.out.println("A foo");
}
}

class B extends A {
public void foo() {
System.out.println("B foo");
}

public void bar() {
System.out.println("B bar");
}
}

现在,当我们有类似的事情时

A b = new B();
b.foo();

然后 Bfoo 方法将被调用。这就是上面描述的现象。你问的是这样的事情:

A b = new B();
b.bar(); // error

这里出现错误的原因是因为无法保证 b 将具有 bar() 方法。据我们所知(或者更确切地说,编译器知道),b 可能是一个谁知道什么的 C 实例。因此,我们必须执行显式转换:

A b = new B();
((B) b).bar();

这是因为 Java 是静态类型的(即使它执行动态绑定(bind))。

关于java - 为什么 equals 不使用强制转换的 equals 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19485252/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com