包装器类引用和用户之间的区别在java中定义了类引用

时间:2016-09-01 12:14:22

标签: java reference wrapper hashcode

假设我有一个自定义类,比如Test。

Test test = new Test(); // test is the reference.

现在,当我打印test的值时,它返回哈希码。

现在考虑,

Integer i = new Integer(10);

当我打印i的值时,它返回10.

有人可以帮我理解这里的区别究竟是什么?我相信它们都是对象引用,但对于包装类引用,它返回它指向的对象的值。

6 个答案:

答案 0 :(得分:0)

创建新类时,它会从toString()继承方法ObjectInteger类重写该方法以返回内部值。

答案 1 :(得分:0)

打印时,会隐式调用toString()方法。

默认情况下(在Test类中)它使用Object类中的一个。对于Integer,它将Integer转换为10-base的字符串。

答案 2 :(得分:0)

您的Test类正在使用Object类的toString()方法来打印hashCode。但对于Integer类,toString方法被覆盖。你可以看到Integer.java here

答案 3 :(得分:0)

用户定义的引用是一个对象,如果你打印该对象意味着你可能会得到一些哈希代码,因为每个类都扩展了Object类,所以你也有了属性(方法)tostring()。

Wrapper类包装其各自的原始数据类型 整数i = new Integer(10); 和 I = 10; 价值相同。

答案 4 :(得分:0)

当您致电System.out.println(Object)(或更一般地说,PrintStream.println(Object))时:

  

此方法首先调用String.valueOf(x)

String.valueOf(Object)返回:

  

如果参数为null,则字符串等于“null”;否则,返回obj.toString()的值。

您的任何对象都不是null,因此调用实例的toString()方法。

如果是Integer

  

该值将转换为带符号的十进制表示形式并以字符串形式返回

对于Test,除非您明确覆盖它(或超类已覆盖它),否则您将调用Object.toString()

  

[T]他的方法返回一个等于值的字符串:

getClass().getName() + '@' + Integer.toHexString(hashCode())

如果这不是所需的行为,请覆盖toString()中的Test

class Test {
  @Override public String toString() {
    // ... Your implementation.
  }
}

答案 5 :(得分:0)

每当您打印对象时,Java都会调用toString()方法。 Object Class中可用的toString()的默认实现。 Object是java中所有Object的基类。

 public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

它将使用完整的包路径@和对象的HashCode打印类Name。

测试类不会覆盖toString()方法。但是java中的所有包装类都会覆盖toString()。所以当你调用Integer方法时,它会调用在Integer类中实现的toString()。