字符串文字和对象文字比较

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

我想出了这个方案,无法理解其背后的逻辑? 我只了解第一个,其余两个无法理解?请说明其内部运作方式?

public class Test {
    public static void main(String[] args) {

        String s = "Karan";
        Object o = "Karan";

        System.out.println(s.equals(o));         // True
        System.out.println(o.equals(s));        // True 
        System.out.println(s == o);            // True
    }
}
java string object equals string-literals
1个回答
0
投票

对象的静态类型和对象的动态类型之间存在差异。

静态类型是编译时已知的类型。对于Object o = "Karan";,静态类型是o左侧的类型,即Object。现在,人们可能会问为什么会这样,因为在编译时可以推断出oString。好吧,如果我们考虑类似的东西

Object o;
if (someCondition) {
    o = "Karam";
} else {
    o = new StringBuffer();
}

然后我们不知道oString还是StringBuffer,因此其静态类型为Object(因为o被定义为Object)。

动态类型是运行时的类型。在上面的示例中,在执行if语句之后,oStringStringBuffer,但不是两者,也没有其他。在您的示例中,Object o = "Karan";的动态类型为String

当通过equals(...)比较对象时,它们必须具有相同的动态类型,以便比较返回true(请注意,此属性是必需的,但不足)。由于您的示例中的o实际上是String,并且内容等于ss.equals(o) == o.equals(s) == true

关于s == o为什么返回true:将在here中讨论。

© www.soinside.com 2019 - 2024. All rights reserved.