java的toString
2015-07-13 14:31
465 查看
为什么我在类中重写他,当输出该类对象的时候却能显示里面的结果?
例如:我输出的是一个对象,却调用到了toString方法 public class TTT { private String id; private String name; public void setId(String id) { this.id = id; } public void setName(String name) { this.name = name; } public String toString() { return "学号:" + id + "\n姓名:" + name; } public static void main(String[] args) { TTT student = new TTT(); student.setId("1"); student.setName("小明"); System.out.println(student); } }
简单的讲之所以调用了toString()方法,不是什么编译器默认的,而是因为我们调用的是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了
相关文章推荐
- JAVA实现实时Process,实时获取输出
- 关于MyEclipse6.5 总是弹出 Update Progress(xx-xx-xx时间)的问题
- 使用Spring Boot快速构建应用
- Please allow Subclipse team to receive anonymous usage statistics for this Eclipse intance(info)
- 深入Struts2的配置文件
- Java多线程
- Javah导出类问题
- JDK版本不一致导致导入的项目报错
- java.net URL类的使用
- java集合
- java PKCS7Padding 加密Cannot find any provider supporting AES/CBC/PKCS7Padding 解决办法
- springMVC下的json数据的传递
- java.net.URL请求远程文件下载
- Java EE实现模拟一个资源管理器
- Spring官网改版后下载
- eclipse的maven项目中target目录m2e-wtp无法提交到SVN的处理办法
- java面向对象简单理解
- 【Java 它 JVM】对象的创建过程
- Spring学习笔记——Sprin管理Bean的原理
- Eclipse maven构建springmvc项目