我想出了这个方案,无法理解其背后的逻辑? 我只了解第一个,其余两个无法理解?请说明其内部运作方式?
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
}
}
对象的静态类型和对象的动态类型之间存在差异。
静态类型是编译时已知的类型。对于Object o = "Karan";
,静态类型是o
左侧的类型,即Object
。现在,人们可能会问为什么会这样,因为在编译时可以推断出o
是String
。好吧,如果我们考虑类似的东西
Object o;
if (someCondition) {
o = "Karam";
} else {
o = new StringBuffer();
}
然后我们不知道o
是String
还是StringBuffer
,因此其静态类型为Object
(因为o
被定义为Object
)。
动态类型是运行时的类型。在上面的示例中,在执行if
语句之后,o
是String
或StringBuffer
,但不是两者,也没有其他。在您的示例中,Object o = "Karan";
的动态类型为String
。
当通过equals(...)
比较对象时,它们必须具有相同的动态类型,以便比较返回true
(请注意,此属性是必需的,但不足)。由于您的示例中的o
实际上是String
,并且内容等于s
,s.equals(o) == o.equals(s) == true
。
关于s == o
为什么返回true
:将在here中讨论。