[英]String Literal and Object Literal comparison
我想出了这个场景并且无法理解它背后的逻辑? 我只看懂了第一个,其余两个看不懂? 请解释它在内部是如何工作的?
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
:这个问题在这篇文章中得到了回答。
String s = "Karan"
这是一个 String 引用所引用的 String 对象。
Object o = "Karan"
这是一个由 Object 引用引用的 String 对象。 超类可以引用子类的对象。
对于s.equals(o)
和o.equals(s)
,底层对象equal()
被调用,因为对象是 String 类型(即使引用 'o' 是 Object 类型)String 的 equals 被调用,它比较了相等的字符串的值。 这就是你得到true
的结果。
s == o
比较 s 和 o 的对象引用。 它们是使用双引号创建的,它使用字符串池,创建对象一次并再次引用它。 所以 s 和 o 都是完全相同的 String 对象。 这使得==
返回 true。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.