Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/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 两个整数对象值相同的基元int将指向其中哪一个?_Java_Oop_Object_Integer - Fatal编程技术网

Java 两个整数对象值相同的基元int将指向其中哪一个?

Java 两个整数对象值相同的基元int将指向其中哪一个?,java,oop,object,integer,Java,Oop,Object,Integer,输出:您好 对。As a也将指向b的整数对象。这里也解释了: 但如果我执行: int a = 30; Integer b = new Integer(30); if( b1 == b2) System.out.println("Hello"); else System.out.println("Hi"); 输出:你好 第二个输出和现在一样好,b1和b2有单独的对象。但是现在“a”指的是什么呢?? 请在此处解释“Hello”输出的原因。编译器实际上将其更改为以下内容: 如果(a=

输出:您好

对。As a也将指向b的整数对象。这里也解释了:

但如果我执行:

int a = 30;
Integer b = new Integer(30);
if( b1 == b2)
    System.out.println("Hello");
else
    System.out.println("Hi");
输出:你好

第二个输出和现在一样好,b1和b2有单独的对象。但是现在“a”指的是什么呢??
请在此处解释“Hello”输出的原因。

编译器实际上将其更改为以下内容:
如果(a==b1.intValue()){}

如果将一个primitve
int
与一个
Integer
进行比较,后者将使用
intValue()
方法自动装箱到一个
int
。如果您使用
val1==val2
比较类型
Integer
的两个实例,则会比较引用,因为您创建了两个包含相同int值的
Integer
的不同实例,所以这里的引用不同

一些注意事项:

您可以使用
valueOf(int)
方法创建
Integer
的实例,而不是使用构造函数。如果传递的参数在特定范围内(
30
在该范围内),则此方法将返回缓存的值。当更改为
valueOf
时,上述示例中的两个实例将是相同的


就我个人而言,我认为自动装箱是一个潜在的错误源,我实际上配置了我的IDE,将自动装箱视为一个错误。通过上面的解释,您可能已经猜到了原因:自动装箱是通过使用
value.intValue()
完成的。如果该值恰好为
null
,则会出现
NullPointerException
。但这是个人品味(以及冒险的意愿),所以YMMV。

您在第一个输出中回答了您的问题。As
a
也将指向
b
的整数对象。所以,在这种情况下也是一样的。
int
并不指向任何东西!虽然
int
的值可能等于某个
Integer
实例包装的值,但
int
肯定不会指向该值或任何其他
Integer
。作为对比点,比Java更新的语言(如Groovy,可能还有未来的Java 10)不区分装箱和未装箱类型;int和Integer是同义词。所有必需的装箱/拆箱都是自动完成的,即使您使用
==
@KlitosKyriacou,我也读过这方面的内容。在我当时提到的情况下会发生什么?例如,在Groovy中,
val1==val2
相当于
val1。equals(val2)
,因为运算符只是特定方法调用的语法糖。@KlitosKyriacou如果
val1
null
,会发生什么?在Java中,后一条语句会得到一个
NullPointerException
。如果val2也不是null,它只会返回false。那是因为发生的事情比我解释的要复杂一点。这取决于对象的类型。对于null,它永远只等于null。如果对象属于实现Comparable的类,则调用compareTo。
class A2
{
    public static void main(String args[])
    {
        int a = 30;
        Integer b1 = new Integer(30);
        Integer b2 = new Integer(30);
        if(a == b1 && a == b2)
            System.out.print("Hello");
        else
            System.out.print("Hi");
        if( b1 == b2)
            System.out.print("Hello");
        else
            System.out.print("Hi");
    } //End of Method
}// End of class