更改Java中对象的默认返回
Java中对象的默认返回是返回toString方法,是否有方法将此行为更改为例如返回数字或其他类型,或者这只是语言的核心不可更改组件更改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
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()
调用。你是对的,这真的很奇怪。。。当您传递对象参数时