当我们在Java中创建Integer类的实例时会发生什么

时间:2019-07-17 10:14:25

标签: java object

我对以下代码感到困惑:

import java.util.*;

public class HelloWorld {
    private int x;
    public HelloWorld(int x) {
       this.x = x;
    }
    public static void main(String[] args) {
       HelloWorld o1 = new HelloWorld(5);
       HelloWorld o2 = new HelloWorld(5);
       System.out.println(o1);
       System.out.println(o2);
       Integer i = new Integer(1);
       Integer j = new Integer(10);
       System.out.println(i);
       System.out.println(j);
    } 
}

很明显,我制作了两个对象HelloWorld类和两个对象Integer类。当我打印它们时,输出就像:

HelloWorld@6d06d69c
HelloWorld@7852e922
1
10

我的疑问是,当我创建helloWorld类的Object时,对象存储了一些引用,但是当我创建Integer类的实例时,值存储在对象中。为什么会这样。

是否也可以将值直接存储在HelloWorld类对象中。

我还注意到,每当我为Java中的任何内置类(如String,Character,List,Map ...)创建对象时,它们都会存储值。那么这些内置类中还存在什么?

2 个答案:

答案 0 :(得分:3)

  

我的疑问是,当我创建helloWorld类的对象时,对象存储了一些引用,但是当我创建Integer类的实例时,值存储在对象中。

否,在两种情况下,值都作为字段存储在实例中(HelloWorldInteger)。

  

是否也可以将值直接存储在HelloWorld类对象中。

这就是您的代码所做的。

如果要更改HelloWorld类的实例转换为字符串的方式,请覆盖toString。例如:

@Override
public String toString() {
    return String.valueOf(this.x);
}

您现在看到的输出是默认toString from Object的输出。

答案 1 :(得分:0)

Java的编译器支持对原语和包装器类进行自动装箱和拆箱。

您可以阅读有关here的信息。

在您的示例中,方法println期望int,这是原始的。因此,编译器会自动将其从Integer拆箱。