Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 字符串文字和对象文字比较_Java_String_Object_Equals_String Literals - Fatal编程技术网

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
。但是对象本身仍然是
字符串<