关于 Java 两个 Integer 相加的问题

2021-04-03 01:01:32 +08:00
 pkookp8

小弟刚开始学 Java,了解到 Java 没有操作符重载 所以使用+操作符对两个类进行相加应该是做不到的

于是对这段代码不是很理解了

class Integer {
    private int value;

    public Integer(int value) {
        this.value = value;
    }

    public int intValue() {
        return this.value;
    }

    public static Integer valueOf(int i) {
        return new Integer(i);
    }
}
public class Main {
    public static void main(String[] argv)
    {
        java.lang.Integer zz = 1;
        java.lang.Integer xx = 2;                   //调用 java.lang.Integer.valueOf(2),返回 java.lang.Integer.Integer 类型

        java.lang.Integer aa = zz + xx;          //zz + xx 是如何实现的?
        System.out.printf("%s\n", aa);          //printf 的时候可以直接把 aa 打印出来,这又是怎么做到的?

        //Integer a = 1;                                //Type mismatch: cannot convert from int to Integer
        //Integer x = Integer.valueOf(1);
        //Integer y = Integer.valueOf(2);
        //Integer z = x + y;                         //The operator + is undefined for the argument type(s) Integer, Integer
                                                               //请问如何自己实现 x+y?
        //System.out.printf("%s\n", z);       //似乎打印了地址, Integer@6d03e736

    }
}

尝试用了断点的方式,发现 zz + xx 似乎会进入两次 java.lang.Integer.intValue 函数

也就是说 zz 调用了 java.lang.Integer.intValue,返回了 int 类型的 1

xx 返回了 int 类型的 2

然后进入了 java.lang.Integer.valueOf(3)

printf 的时候可以直接把 aa 打印出来

问题

  1. java.lang.Integer 是怎么实现 Integer a = 1;而不报错“Type mismatch: cannot convert from int to Integer”的?
  2. java.lang.Integer 又是如何实现 x+y?
  3. java.lang.Integer 还能直接用%s 打印

不知道用什么关键词搜索这些问题

945 次点击
所在节点    Java
1 条回复
yuanmomo
2021-04-03 06:12:30 +08:00
1 Java 里面自动装箱,会自动把基本类型转换成包装类型

2 Java 里面的自动拆箱,会自动把包装类型转换为基本类型。

3 %s 表示打印成字符串,会自动调用 tostring 方法,将这个对象转换成字符串。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/767712

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX