Object类(toString equals finallize hashCode方法)(查API文档)

我们API文档,以及jdk版本,以及rt-jar应该是对应相同的版本
帮助文档尽量看英文的
Object是所有类层级的根(Class Object is the root of the class hierarchy)

关于Object中的toString方法
SUN在Object类中设计toString(),目的是返回java对象的字符串表示形式

在现实的开发过程中,Object里边的toString方法已经不够用了。
因为Object的toString方法不够用
大部分都是要重写toString方法

SUN是这样写toString方法的:
public String toString(){
	return getClass().getname() + '@' +Integer.toHexString(hashCode());
}
Object中的toString方法返回:		类名@ java对象的内存地址经过哈希算法得出的int类型值再	转换成十六进制
这个输出结果可以等同看做java对象在堆中的内存地址。
public class Test{
	public static void main(String[] args){
	//创建一个Object类型的对象.
	Obejct o1 = new Object();

	//调用toString方法
	String oStr = o1.toString();

	System.out.println(oStr);//打印看这个方法是什么
	//运行结果:java.lang.Object@34c45dca
	}
	Person p1 = new Person();
	String pStr = p1.toString();   //默认继承了Object类同时也会继承其内部的方法
	System.out.println(pStr);	//test.Person@5b6f7412,
	//重写后输出重写的方法


	//观察直接输出对象名的现象
	Person p2 = new Person();
	//则说明System.out.println(引用类型); 会调用引用类型的toString方法
	System.out.println(p2); //输出:Person[name=gongli,age=50]
}
//所有类都会默认继承Object类
class Person{
	String name;
	int age
	public Person(String name,int age){
		this.name = name;
		this.age = age;
	}
	
	//重写toString方法
	//根据项目的需求而定。
	//需求规定,显示格式
	public String toString(){
	return "Person[name="+name+",age="+age+"]";
		}
}

1.关于Object类中的equal方法. 也是需要按照需求进行重写的

2.源码中Object中的equals写法:
public boolean euqals(Object obj)
{
return(this == obj);
}
是通 过内存地址来判断是否相等的,相同为true,不同为false
Object中的equals方法比较的是两个引用的内存地址

3.Object 中的equals方法的设计目的:判断两个对象是否一样

4.在现实的业务逻辑中,比较是否相等应该看内容,所以原来的比较内存地址就不够用了,所以需要重写,按照业务需求重写

public class Test{	
public static void main(String[] args){
	Object o1 = new Object();
	Object o2 = new Object();	
	System.out.println(o1.equals(o2));  //这里输出的结果为false,因为对比源码可以知道 o2和o1 是通	过内存地址来判断是否相等的,相同为true,不同为false
	
	Star s1 = new Star(100,"xuz");
	Star s2 = new Star(100,"xuz");
	System.out.println(s1.equals(s2));  //按照上面的分析,在重写equals之前这里会输出false
	

	//
}
}
class Star{
	//明星的id
	int id;
	//明星的名字
	String name;
	public Star(int id,String name)
	{
		this.id = id;
		this.name = name;
	}
	//重写要求为,如果身份证号一致,并且名字一致,则代表为同一个人  
	//根据需求重写Object方法
	public boolean equals(Object obj) //这里用到了多态,首先Star继承与Object,euqals的形参里传的是	Obejct类(父类) obj, 实际上我们如果比较两个Star类之间,传进来的也是一个Star类(子类),但是我们	是要去比较name 以及id ,这两个属性在Object类型中是没有的,所以需要将obj进行一个强制类型转换,将其	转换为Star类,则将会有name以及id的属性
	 {
	 if(obj instanceof Star) //类型判断,防止不是Star类传进来,导致子类之间互转,因为euqals的入口是							Object类,所有的Object子类均可传进来
	 {
		Star s1 = Star(obj);	//父类型为子类型
		if(/*s1.name = this.name*/(通过下面的分析可以发现,两个字符串是否相等,不能直接通过等号来		判断)s1.equals(s2) == true && s1.id = this.id)  //字符串的比较在下面介绍
		{return true;}	
	}
	  return false;
	 }
}

关于比较java语言中如何比较两个字符串是否一致
String类里也会重写equals方法的

public class Test01{
	
	String s1 = new String("abc");
	String s2 = new String("abc");

	System.out.println(s1 == s2);  //结果为false
	System.out.println(s1.equals(s2));//结果为true  从这里看出String中equals方法是被重写过的,否								则比较两个类的内存地址是会返回false的

}
/*以下是String类里的源代码,为String类里对equals的重写*/
 public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String aString = (String)anObject;
            if (!COMPACT_STRINGS || this.coder == aString.coder) {
                return StringLatin1.equals(value, aString.value);
            }
        }
        return false;
    }

关于Objecet中的finalize方法
finallize方法什么时候调用?
1.finallize方法每个java对象都有
2.finallize方法不需要程序员调用,由系统自动调用。
3.java对象如果没有更多的引用去指向它,则该java对象称为垃圾数据。
等待垃圾回收器的回收,垃圾回收器在回收这个java对象之前会自动调用该对象的finallize 方法

	finallize方法是该对象马上就要被回收了,例如:需要释放资源,则可以在该方法中去释放

	 protected void finalize() throws Throwable { } 从JDK13 Object类里粘下来的源码
public class Test{
public static void main(String[] args){
	Person p1 = new Person();

	p1 = null;//没有引用再指向它,等待回收

	//程序员只能“建议”垃圾回收,回收垃圾
	System.gc();

}
}

class Person{
	//重写Object中的finallize方法. 重写一个Object方法的时侯,直接去Obeject源码中粘贴,防止写错
	protected void finalize() throws Throwable { 
		System.out.println(this + "马上后就要被回收了")//让引用再次重新指向该对象,该对象不是垃圾数据,不会被垃圾回收器回收
		//Person p = this;
	}
	
}

hashCodef方法返回的是该对象的哈希码值
java对象的内存地址经过哈希算法得出的int类型的值

public class Test{
	public static void main(String[] args){
		Test t1 = new Test();
		System.out.println(t1.hashCode());
	}
}
发布了28 篇原创文章 · 获赞 0 · 访问量 434

猜你喜欢

转载自blog.csdn.net/wenshao007/article/details/104378582