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";
}
答案 0 :(得分:2)
Java中对象的默认返回是返回toString方法
PrintStream.println
的工作原理。 java中的任何对象都扩展java.lang.Object
,因此继承了Object
行为。特别是,任何以Object
作为参数的方法,也可以采用其他类型的任何对象。但是,您可以覆盖public
中定义的任何protected
或Object
方法。在您的情况下,您应该覆盖toString()
类中的Test
方法,否则如果您将Test
对象传递给PrintWriter.println()
,它将使用来自超类的toString
(在你的情况下Object
)。所以,如果我理解你的问题,答案是不。
更新:您的术语有误。 java中没有默认的对象返回。返回Object.toString
是仅PrintStream.println(Object)
的默认行为。
Update2:更广泛地说,除了upcasting之外,Java不支持隐式类型转换。在您的情况下,Test
扩展了Object
,但它不会延伸String
(实际上,String
是最终的,因此您无法对其进行扩展) 。因此,如果您尝试将Test
对象传递给只需String
的方法,则会出现编译错误,因为String
和Test
属于不同的类分支层次结构。
答案 1 :(得分:1)
你实际上是在打电话
而不是
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打印的内容,请执行上面的操作,并将其传递给不同的内容。