更改Java中对象的默认返回值

时间:2015-03-11 02:17:03

标签: java

Java中对象的默认返回是返回toString方法,是否有办法将此行为更改为例如返回数字或其他类型,或者这只是该语言的核心不可更改组件?

Test test = new Test();
blankMethod(test);

我不确定为什么人们说我的假设是错的...如果我覆盖对象的toString方法,它将输出新的toString方法......

@Override
public String toString() {
    System.out.println("This method is run when the object is used as a parameter");
    return "test";
}

3 个答案:

答案 0 :(得分:2)

  

Java中对象的默认返回是返回toString方法

PrintStream.println的工作原理。 java中的任何对象都扩展java.lang.Object,因此继承了Object行为。特别是,任何以Object作为参数的方法,也可以采用其他类型的任何对象。但是,您可以覆盖public中定义的任何protectedObject方法。在您的情况下,您应该覆盖toString()类中的Test方法,否则如果您将Test对象传递给PrintWriter.println(),它将使用来自超类的toString (在你的情况下Object)。所以,如果我理解你的问题,答案是

更新:您的术语有误。 java中没有默认的对象返回。返回Object.toString是仅PrintStream.println(Object)的默认行为。

Update2:更广泛地说,除了upcasting之外,Java不支持隐式类型转换。在您的情况下,Test扩展了Object,但它不会延伸String(实际上,String是最终的,因此您无法对其进行扩展) 。因此,如果您尝试将Test对象传递给只需String的方法,则会出现编译错误,因为StringTest属于不同的类分支层次结构。

答案 1 :(得分:1)

你实际上是在打电话

PrintStream.println(Object x)

而不是

public void println(String x)

PrintStream.println(Object x)实施如下:

public void println(Object x) {
     String s = String.valueOf(x);
     synchronized (this) {
        print(s);
        newLine();
    }
}

该方法调用String.valueOf(x),其实现如下:

public static String valueOf(Object obj) {
   return (obj == null) ? "null" : obj.toString();
}

请注意,正在调用Object.toString()方法。

有关隐式转化的说明

当调用字符串连接运算符(Object)时,String仅使用toString方法隐式转换为+。更确切地说,转换的工作原理如下:

  

原始类型T的值x首先转换为参考值...

     

然后通过字符串转换将此引用值转换为String类型。   现在只需要考虑参考值。

     

如果引用为null,则将其转换为字符串“null”(四个   ASCII字符n,u,l,l)。否则,执行转换   好像是通过调用引用对象的toString方法   没有争论;但是如果调用toString方法的结果   为null,然后使用字符串“null”。

     

toString方法由原始类Object“

定义

Java Language Specification 15.18.1

扩展隐式转换思想的一种语言(很多)是Scala,它允许人们将转换(例如,A - > B)带入范围,然后只要某些类型(A)被传递,就会调用它。当需要不同类型(B)时的参数。

答案 2 :(得分:1)

这回答了"为什么人们说我的假设错了"。

这是一个简单的程序:

public class Test {
  public String toString(){
    return "I am a Test object.";
  }

  public int add(int a, int b){
    return a+b;
  }
  public static void main(String[] args) {
    Test object = new Test();
    System.out.println(object);
    System.out.println(object.add(2,2));
    System.out.println(adder(object));
  }

  public static int adder(Test test){
    return test.add(3,5);
  }
}

输出:

I am a Test object.
4
8

System.out.println方法必须以某种方式将其参数转换为String。如果传递了对象引用,则使用其toString()方法。如果传递了一个原语,例如int表达式,它会以适当的方式对其进行转换。

这与被归还的内容无关。

它也与将引用作为参数传递的任何自动转换无关。请参阅输出的第三行,这取决于使用Test引用作为adder传递给Test,而不是String

如果您想更改println打印的内容,请执行上面的操作,并将其传递给不同的内容。