Java學習(二)Object

這個類很有意思,是所有類的爹,這個類中定義的東西是所有類中具備的。
給大家上代碼,來理解這個。

package duotai;
class d{
	
}
public class object_d {
	
	public static void main(String[] args) {
    d d1=new d();
    d d2=new d();
    System.out.print(d1.equals(d2));
	}
}
輸出:false//d1和d2因爲內存不一樣所以是false。
大家可以看到,d類中什麼也沒有,但是可以用equals方法,那麼這個方法哪來的呢,就是繼承的他的父親,Object這個類的。

如果類的對象不一樣的話,可以用equals比較嗎?

package duotai;
class d{
	
}
class c{
	
}
public class object_d {
	
	public static void main(String[] args) {
    d d1=new d();
    c c1=new c();
    System.out.print(d1.equals(c1));
	}
}
輸出:false
因爲equals是c和d類的爹Object的方法所以,Object可以隨便比較兒子啊。

如果自定義類中有和父類相同的功能咱們沒必要自己定義,繼承父類的功能即可,建立自己特有的內容就好,這就是覆蓋。
氣死我了,上代碼(Object類中自帶equals方法):

package duotai;
class d{
	private int num;
	d(int num){
		this.num=num;
	}
	public boolean equals(Object obj) {
		d d1=(d)obj;//如果沒有下轉,就會報錯,Object裏並沒有定義num變量。
		return this.num==d1.num;
	}
}
public class object {
	public static void main(String[] args) {
   d d2=new d(2);
   d d3=new d(2);
   System.out.print(d2.equals(d3));
	}
}
輸出是:true

那麼都是繼承的父類equals可以跨類比較嗎?

package duotai;
class d{
	private int num;
	d(int num){
		this.num=num;
	}
	public boolean equals(Object obj) {
		d d1=(d)obj;//如果沒有下轉,就會報錯,Object裏並沒有定義num變量。
		return this.num==d1.num;
	}
}
class e{
	private int num;
	e(int num){
		this.num=num;
	}
}
public class object {
	
	public static void main(String[] args) {
   d d2=new d(2);
   e e2=new e(2);
   System.out.print(d2.equals(e2));
	}
}
這樣是不行的,因爲equals重寫的裏面,咱們是把Object轉成了d類,那麼問題來了,e類能轉成d類嗎?答案是不行,因爲兒子憑什麼轉兒子,大家都一樣都是兒子。

一天一個學廢小技巧:
咱們看看Object的一些函數
首先咱們直接試試類的實體用toString()函數和hashCode()的效果

package duotai;
class d{
	private int num;
	d(int num){
		this.num=num;
	}
}
class e{
	private int num;
	e(int num){
		this.num=num;
	}
}
public class object_b {
	
	public static void main(String[] args) {
   d d2=new d(2);
   System.out.println(Integer.toHexString(d2.hashCode()));
   System.out.print(d2.toString());
	}
}
輸出是:52cc8049
duotai.d@52cc8049這
是類的哈希值,這是內存的經典數據結構啦。

是不是所有的對象都具備哈希值?答案是肯定的
咱們再繼續看getClass功能

package duotai;
class d{
	private int num;
	d(int num){
		this.num=num;
	}
	public void a() {
		System.out.print("lala");
	}
}

public class object {
	public static void main(String[] args) {
   d d2=new d(2);
   Class c=d2.getClass();//類文件對象
   System.out.println(c.getName());
	}
}
得到的是:duotai.d,d2對應的類名,當然Class類中有很多種方法。

不知道大家發現了沒有,Object類的toString()作用就是c.getName()+Integer.toHexString(d2.hashCode())的結果。

每日一練:

自己寫一個類重寫Object父類的toString()方法,改成輸出你的名字+類的名字。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章