java的toString是一个什么方法,为什么我在类中重写他,当输出该类对象的时候却能显示里面的结果?(转)


例如:我输出的是一个对象,却调用到了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);
}
}

首先还是推荐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());
}


所以打印结果为[email protected]

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

补充一点:
作为比较,当调用print(String s)时,虽然同为对象,但并没有调用toString()方法,打印结果也不是[email protected]了

原文:http://zhidao.baidu.com/link?url=XH5JQIrvRXR0P5GPMjDd2byytZFWne_Ieuvn7gSIW5_c36duEy-3hOuuEN9KN5ZRhqPLntzO7LC9lmU4nJ2MS_

java的toString是一个什么方法,为什么我在类中重写他,当输出该类对象的时候却能显示里面的结果?(转)

时间: 2024-08-25 17:48:25

java的toString是一个什么方法,为什么我在类中重写他,当输出该类对象的时候却能显示里面的结果?(转)的相关文章

多文档中建立一个对话框类,通过这个方法来在其他类中得到对话框对象指针,访问对话框成员

{ // 添加内容 m_pDrawTool = new CDrawToolDlg; m_pDrawTool->Create(IDD_DRAWTOOLS, this); m_pDrawTool->ShowWindow(SW_SHOW); // 让窗口出现在屏幕右下方 CRect dlgRect; CRect mainRect; m_pDrawTool->GetClientRect(&dlgRect); GetWindowRect(mainRect); // 计算显示的坐标 int

检测某个方法是否属于某个类中--解析php函数method_exists()与is_callable()的区别

php函数method_exists() 与is_callable()的区别在哪?在php面相对象设计过程中,往往我们需要在调用某一个方法是否属于某一个类的时候做出判断,常用的方法有 method_exists()和is_callable() 相比之下,is_callable()函数要高级一些,它接受字符串变量形式的方法名作为 第一个参数,如果类方法存在并且可以调用,则返回true.如果要检测类中的方法是否能被调用,可以给函数传递一个数组而不是类的方法名作为参数.数组必须包含对象或类名,以将其作

JavaSE8基础 多态 子类重写了父类的普通方法 父类引用调用子类中重写的方法

os :windows7 x64    jdk:jdk-8u131-windows-x64    ide:Eclipse Oxygen Release (4.7.0)        代码: class Father { public int num = 1; public void sayHello() { System.out.println("hello"); } public static void staticFun() { System.out.println("s

关于在C#中对类中的隐藏基类方法和重写方法的理解

最近在学习C#,在C#中的类看到重写和隐藏基类的方法这些概念.才开始感觉自己不是很理解这些概念.也区分不开这些概念.通过自己的查找资料和练习后.慢慢的理解了类中的隐藏和重写这个概念.在C#中只有在基类定义了一些虚方法才能在派生类中重写基类中的虚方法.但是如果在派生类中使用隐藏方法,就不用在基类中定义虚方法.虚方法和重写实现的功能感觉是差不多的.都是在派生类中改变了基类中的方法,但是两者还是有质的区别,概念的性质也是不一样的.   重写是指:将基类中的方法替换掉,也就是抹掉基类中的原有方法,在派生

Java提高篇——equals()与hashCode()方法详解

java.lang.Object类中有两个非常重要的方法: 1 2 public boolean equals(Object obj) public int hashCode() Object类是类继承结构的基础,所以是每一个类的父类.所有的对象,包括数组,都实现了在Object类中定义的方法. equals()方法详解 equals()方法是用来判断其他的对象是否和该对象相等. equals()方法在object类中定义如下: public boolean equals(Object obj)

java.long.object类中的重要方法

一:概念 java.long.object Object类是所有Java类的祖先.每个类都使用 Object 作为超类. 二:方法概览 clone() 创建并返回此对象的一个副本. equals(Object obj) 指示某个其他对象是否与此对象“相等”. finalize() 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法.(JVM中自带的垃圾回收机制只能回收new出的对象) getClass() 返回一个对象的运行时类. hashCode() 返回该对象的哈希码值

Java连载56-toSting方法和equals方法

Java连载56-toSting方法和equals方法一.关于object中的toString?方法: 1.SUN公司在Object类中设计toString方法的目的:返回java对象的字符串的表示形式. 2.在现实的开发过程中,Object里面的toString方法已经不够用了,因为Object的toString方法实现?的结果不满意.Object中的toString方法实现的结果不满意.Object中的呢toString?方法要被重写了. 3.println打印的如果是对象的话,那么就会默认

在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解失效的原因和解决方法

在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解是不会生效的. 比如,下面代码例子中,有两方法,一个有@Transational注解,一个没有.如果调用了有注解的addPerson()方法,会启动一个Transaction:如果调用updatePersonByPhoneNo(),因为它内部调用了有注解的addPerson(),如果你以为系统也会为它启动一个Transaction,那就错了,实际上是没有的. @Service public cla

java多态的2种表现形式 方法重载和方法覆盖

方法重载:同一个类中,方法名相同,参数列表不同的2个或多个方法构成方法的重载. 方法覆盖:子类重新实现了父类中的方法. 1.方法的重载实例(Overload) 指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法, 然后再调用时,VM就会根据不同的参数样式,来选择合适的方法执行 /** * 方法重载满足的条件 * 1.同一个类中,方法名相同,参数列表不同的2个或多个方法构成方法的重载 * 2.参数列表不同指参数的类型,参数的个数,参数的顺序至少一项不同 * 3.方法的返回值类型