更改Java中对象的默认返回

更改Java中对象的默认返回,java,Java,Java中对象的默认返回是返回toString方法,是否有方法将此行为更改为例如返回数字或其他类型,或者这只是语言的核心不可更改组件 Test test = new Test(); blankMethod(test); 我不知道为什么人们说我的假设是错误的。。。如果我重写object的toString方法,它将输出新的toString方法 @Override public String toString() { System.out.println("This method is ru

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

Test test = new Test();
blankMethod(test);
我不知道为什么人们说我的假设是错误的。。。如果我重写object的toString方法,它将输出新的toString方法

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

你真的在打电话吗

而不是

PrintStream.println(对象x)
实现如下:

public void println(Object x) {
     String s = String.valueOf(x);
     synchronized (this) {
        print(s);
        newLine();
    }
}
public static String valueOf(Object obj) {
   return (obj == null) ? "null" : obj.toString();
}
该方法调用
String.valueOf(x)
,其实现如下:

public void println(Object x) {
     String s = String.valueOf(x);
     synchronized (this) {
        print(s);
        newLine();
    }
}
public static String valueOf(Object obj) {
   return (obj == null) ? "null" : obj.toString();
}
请注意,正在调用
Object.toString()
方法

关于隐式转换的注意事项

调用字符串连接运算符(
+
)时,仅使用
toString
方法将
对象
隐式转换为
字符串
。更确切地说,转换工作如下:

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

然后将该引用值逐字符串转换为类型字符串。 现在只需要考虑参考值

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

toString方法由原始类对象定义“

扩展隐式转换思想的一种语言(许多语言中的一种)是Scala,它允许将转换(例如a->B)引入作用域,然后在需要不同类型(B)时将某个类型(a)作为参数传递时调用该作用域。

这回答了“为什么人们说我的假设是错误的”

下面是一个简单的程序:

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
方法必须以某种方式将其参数转换为字符串。如果向其传递对象引用,则使用其toString()方法。如果向其传递原语,如
int
表达式,则以适当的方式转换

这与归还的东西无关

它也与将引用作为参数传递时的任何自动转换无关。请参阅输出的第三行,这取决于使用我传递给
加法器的
测试
引用作为
测试
,而不是
字符串

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

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

这就是
PrintStream.println
的工作原理。java中的任何对象都扩展了
java.lang.object
,因此继承了
object
行为。特别是,任何将
object
作为参数的方法,也可以接受其他类型的任何对象。不过,您可以覆盖任何
public
protected>对象Object
中定义的code>method。在您的情况下,您应该重写
Test
类中的
toString()
方法,否则,如果您将
Test
对象传递到
PrintWriter.println()
,它将使用超类中的
toString
Object
)因此,如果我正确理解了你的问题,答案是否定的

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


更新2:更广泛地说,Java不支持隐式类型转换,除了。在您的例子中,
Test
扩展了
Object
,但它不扩展
String
(实际上,
String
是最终的,因此您不能扩展它)因此,如果您试图将
Test
对象传递给只接受
String
的方法,您将得到编译错误,因为
String
Test
属于类层次结构的不同分支。

您的假设是错误的。引用类型的值是对对象的引用的值。另外,还有重载的
println
方法,该方法接受类型为
Object
的参数,并调用其
toString
方法。
“Java中对象的默认返回是返回toString方法”
——您在哪里找到了这一点信息?您混淆了什么是
PrintStream\println(…)
可以,也就是调用对象上的
toString()
,并具有对象的固有属性。这是两件完全不同的事情。可以通过消除坏前提,并提供更多有关CodeCamper试图实现什么的信息来改进。在我的评论中,应该是
“您。。。“
。我不认为这是正确的,因为在我更新的问题中使用我的覆盖方法。您将看到toString方法始终运行。当您将对象用作任何参数时。此答案也与文档相矛盾。最终,转换通过以下方式完成:“如果参数为null,则返回一个等于“null”的字符串;否则,返回obj.toString()的值。”。在本例中,它不是空的。我是在解释,但因为它造成了混乱,我将更新答案。@codecamp我更新了我的答案,希望澄清。我扩展了Java和其他语言中的隐式转换。如果您创建一个空白方法并在中传递对象,我很确定它仍然运行toString方法。如果您将
Test
对象传递给一个只接受
String
的方法,您将得到编译错误。没有隐式的
toString()
调用。你是对的,这真的很奇怪。。。当您传递对象参数时