java 中的StringtoString方法 输出结果中为什么会有3.19999996E15?

import java.util.*;
public class Time{
public static void main(String[] args) {
Date date1 = new Date();
System.out.println("date and time is "+date1);
String t =date1.toString();
t = t.substring(11,t.indexOf('C'));
System.out.println("t="+t);
double sum=0.0;
for (double i=0;i<80000000 ;i++ ){
sum=sum+i;
}
System.out.println(""+sum);
Date date2=new Date();
t=date2.toString();
t=t.substring(11,t.indexOf('C'));
System.out.println("now time is"+date1);

}
}

输出结果:
date and time is Sat Sep 24 10:47:15 CST 2016
t=10:47:15
3.19999996E15
now time isSat Sep 24 10:47:15 CST 2016

并没有声明实例化t,为什么t能调用方法?t也是像date1一样的吗?

首先还是推荐lz看源代码

简单的讲之所以调用了toString()方法,不是什么编译器默认的,而是因为lz你调用的是out.print()方法
仔细看源代码,在PringStream类中,print方法是这样写的
public void print(Object obj) {
write(String.valueOf(obj));
}
此时调用了String的静态方法valueof
这个方法是这样的
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();//注意看,这里调用了toString方法
}
而所有的java对象都派生自Object,如果没有对该方法做重写
则会调用super.toString()
Object中这个方法是这样定义的
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
所以打印结果为classname+@hashcode

当重写了toString方法后,根据java的动态绑定原理,调用的为当前对象的toString()方法,所以当你重写了student的toString方法后,打印结果不再是ttt@123456,而是
学号:1
姓名:小明

补充一点:
作为比较,当调用print(String s)时,虽然同为对象,但并没有调用toString()方法,打印结果也不是java.lang.String@hashcode了追问

感谢你的回答,但我是刚入门自学,有个问题还是不懂,麻烦解答一下
据我所知,想要调用方法分为调用实例方法和类方法,而代码是
return (obj == null) ? "null" : obj.toString();
所以这里obj调用toString();是实例方法,那么是不是事先要声明实例化对象obj才能进行调用呢?

温馨提示:答案为网友推荐,仅供参考
相似回答