程序如下:
class A
{
String name;
A(String name)
{
this.name=name;
}
public String toString()
{
return name;
}
}public class aaa
{
public static void main(String args[])
{
A b=new A("c");
System.out.println(b);
}
}
结果是输出:c
很奇怪在运行到System.out.println(b)时,程序会调用class A里的成员函数toString().这是什么原理? 并且为什么会输出c而不是b?请高手帮忙解释一下,十分感谢
class A
{
String name;
A(String name)
{
this.name=name;
}
public String toString()
{
return name;
}
}public class aaa
{
public static void main(String args[])
{
A b=new A("c");
System.out.println(b);
}
}
结果是输出:c
很奇怪在运行到System.out.println(b)时,程序会调用class A里的成员函数toString().这是什么原理? 并且为什么会输出c而不是b?请高手帮忙解释一下,十分感谢
public String toString()
{
return "Happy National Day!!!";
}
System.out.print(b);---> "Happy National Day!!!" will be printed...
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
而String.valueOf(Object x)是
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
这里调用了toString()方法,所以输出是c
System.out.println(obj.toString())进行输出
即使你的class A中不写toString()方法,由于继承的关系,你打印System.out.println(b); 这里面的b也会调用Object类的方法toString();
现在你重写了toString()方法,System.out.println(b); 里的b就会调用A类的方法toString(),b只是个引用变量,当你new A("c"); "c"作为实参传给构造函数A(String name){},而this.name=name;等号左边的name是属性name,等号右边的name是入参String name里的 name,也就是c
System.out.println(b); 等价于System.out.println(b.toString()); 方法toString里的返回值是name。要是还不明白,LZ需要多学习构造和继承了。