Java基础突击第七天0016(Object类)

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()打印内存地址,避免导致无意识的递归调用。



猜你喜欢

转载自blog.csdn.net/u012144068/article/details/80954435