Java 字符串文字和对象文字比较
我想到了这个场景&无法理解其背后的逻辑我只懂第一个,其余两个不懂?请解释一下它是如何工作的Java 字符串文字和对象文字比较,java,string,object,equals,string-literals,Java,String,Object,Equals,String Literals,我想到了这个场景&无法理解其背后的逻辑我只懂第一个,其余两个不懂?请解释一下它是如何工作的 public class Test { public static void main(String[] args) { String s = "Karan"; Object o = "Karan"; System.out.println(s.equals(o)); // True System.out.print
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
左侧的类型,即对象
。现在,人们可能会问为什么会这样,因为在编译时,可以推断o
是字符串。好吧,如果我们考虑像
Object o;
if (someCondition) {
o = "Karam";
} else {
o = new StringBuffer();
}
然后我们无法知道o
是String
还是StringBuffer
,因此它的静态类型是Object
(因为o
被定义为Object
)
动态类型是运行时的类型。在上面的示例中,在执行if
-语句之后,o
要么是String
要么是StringBuffer
,但不是两者兼而有之。在您的示例中,动态类型为Object o=“Karan”代码>是字符串
当通过equals(…)
比较变量时,它们必须具有相同的动态类型,以便比较返回true
(请注意,此属性是必需的,但还不够)。由于您的示例中的o
实际上是一个String
,内容等于s
,s.equals(o)==o.equals(s)==true
至于为什么s==o
返回true
:问题在中得到了回答。对象的静态类型和变量的动态类型之间存在差异
静态类型是编译时已知的类型。对于Object o=“Karan”
,静态类型为o
左侧的类型,即对象
。现在,人们可能会问为什么会这样,因为在编译时,可以推断o
是字符串。好吧,如果我们考虑像
Object o;
if (someCondition) {
o = "Karam";
} else {
o = new StringBuffer();
}
然后我们无法知道o
是String
还是StringBuffer
,因此它的静态类型是Object
(因为o
被定义为Object
)
动态类型是运行时的类型。在上面的示例中,在执行if
-语句之后,o
要么是String
要么是StringBuffer
,但不是两者兼而有之。在您的示例中,动态类型为Object o=“Karan”代码>是字符串
当通过equals(…)
比较变量时,它们必须具有相同的动态类型,以便比较返回true
(请注意,此属性是必需的,但还不够)。由于您的示例中的o
实际上是一个String
,内容等于s
,s.equals(o)==o.equals(s)==true
至于为什么s==o
返回true
:这个问题在中得到了回答。String s=“Karan”
这是一个由字符串引用引用的字符串对象
Object o=“Karan”
这是由对象引用引用的字符串对象。超类可以引用子类的对象
对于s.equals(o)
和o.equals(s)
这两个对象,都会调用底层对象equal()
,因为对象是String类型的(即使引用“o”是Object类型),所以会调用String的equals来比较相等字符串的值。这就是您得到的结果true
s==o
比较s和o的对象引用。它们是使用双引号创建的,双引号使用字符串池,创建一次对象,然后再次引用它。所以s和o都是完全相同的字符串对象。这使得==
返回true String s=“Karan”
这是由字符串引用引用的字符串对象
Object o=“Karan”
这是由对象引用引用的字符串对象。超类可以引用子类的对象
对于s.equals(o)
和o.equals(s)
这两个对象,都会调用底层对象equal()
,因为对象是String类型的(即使引用“o”是Object类型),所以会调用String的equals来比较相等字符串的值。这就是您得到的结果true
s==o
比较s和o的对象引用。它们是使用双引号创建的,双引号使用字符串池,创建一次对象,然后再次引用它。所以s和o都是完全相同的字符串对象。这使得==
返回true 由于两者都是字符串文字,并且指向字符串常量池中的同一引用,因此没有“对象文字”,两者都是字符串文字(由于字符串常量池解析为同一实例),其中一个恰好被分配给类型为object
的变量,而不是string
。但是对象本身仍然是一个字符串
。您能更精确一点吗?但我们正在创建对象类型为“no,在objecto=“Karan”的情况下”代码>我们正在创建(或实际从字符串常量池重用)字符串类型的对象,并将对该对象的引用存储在对象类型的变量中。@MandarDharurkar否,这不是重复的。因为两者都是字符串文本,并且指向字符串常量池中的同一引用。没有“对象文本”,两者都是字符串文本(由于字符串常量池被解析为同一个实例),一个变量恰好被分配给一个类型为Object
的变量,而不是string
。但是对象本身仍然是字符串<