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

xiaoxiao2021-02-28  73

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:

FangXyInfo@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就是指代的本身。然后我们就写了如下的代码:@Overridepublic String toString(){       return "对象地址:"+this;}可是,这样的话,就导致了toString()方法的无限递归调用,最终导致内存溢出。为什么会这样呢?

我们知道,当我们使用+进行字符串的连接时,如果+后面跟的不是一个字符串的话,会自动调用其toString()方法。(ps:因为java中所有的对象默认继承自Object对象,而toString()方法是Object中的方法,所以所有的对象都会有toString()方法)。就像上面,就会调用this.toString()方法。我们知道,this指的就是本身,所以调用的就是本身的toString()方法,也就是还是这个方法。那么问题来了,我们调用一个toString()方法后,它为了将this转为字符串,一直调用自身的toString()方法,导致了递归调用,最终导致内存溢出。所以,我们可以调用super.toString()打印内存地址,避免导致无意识的递归调用。

转载请注明原文地址: https://www.6miu.com/read-2632460.html

最新回复(0)