繁体   English   中英

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

[英]Difference between wrapper class reference and user defines class reference in java

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

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

现在,当我打印test的值时,它将返回hashcode。

现在考虑,

Integer i = new Integer(10);

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

有人可以帮助我了解这里的区别是什么吗? 我相信两者都是对象引用,但是对于包装类引用,它返回所指向的对象的值。

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

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

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

您的Test类使用Object类的toString()方法,该方法打印hashCode。 但是对于Integer类,将重写toString方法。 您可以在这里看到Integer.java

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

包装器类包装各自的原始数据类型Integer i = new Integer(10); 和i = 10; 两者的价值相同。

当您调用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()) 

如果这不是期望的行为,请在Test重写toString()

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM