Object类
所有的Class都有一个公共的父类Object。一个类只要没有显示继承,就是Object的子类。
构造:public Object()
普通:public boolean equals //默认比较对象地址
public String toString() //打印对象
public int hashCode // 取得哈希码
public class TestJava{
}
class Info{
public String name = "FangXy";
public int age = 31;
}
class Demo{
public static void main(String[] args){
Info info = new Info();
System.out.println(info.name.toString());
//System.out.println(info.age.toString());
System.out.println(info);
System.out.println(info.toString());
}
}//Demo
Output:
FangXy
Info@15db9742
Info@15db9742
可见输出对象本身和输出对象.toString()方法并无不同。
name.toString()输出FangXy
age.toString() 编译错误
不过把age包装后:
Integer i = new Integer(info.age);
即可编译成功,i.toString() -> 31.
总结:
1. toString()函数返回1个String对象.
2. toString()函数可以被重写, 而且jdk介绍中建议我们为所有类重写这个方法.
3. 不重写这个方法的话, 返回值是 getClass().getName() + '@' + Integer.toHexString(hashCode())
4. toString()不是静态方法, 必须实例化对象才能调用.
有一点有意思的事儿
如果我们想打印出一个对象的引用地址,我们可以想到重写toString()方法,在该方法中打印this的值,因为this就是指代的本身。
然后我们就写了如下的代码:
@Override
public String toString(){
return "对象地址:"+this;
}
可是,这样的话,就导致了toString()方法的无限递归调用,最终导致内存溢出。
为什么会这样呢?
我们知道,当我们使用+进行字符串的连接时,如果+后面跟的不是一个字符串的话,会自动调用其toString()方法。(ps:因为java中所有的对象默认继承自Object对象,而toString()方法是Object中的方法,所以所有的对象都会有toString()方法)。就像上面,就会调用this.toString()方法。我们知道,this指的就是本身,所以调用的就是本身的toString()方法,也就是还是这个方法。那么问题来了,我们调用一个toString()方法后,它为了将this转为字符串,一直调用自身的toString()方法,导致了递归调用,最终导致内存溢出。所以,我们可以调用super.toString()打印内存地址,避免导致无意识的递归调用。