java public object_Java_Object
說一下java中的Object類。
1、Object:
Object是java類庫中的一個特殊類,也是所有類的父類。
Object類定義了一些有用的方法,由于是根類,這些方法在其他類中都存在,一般是進行了重載或重寫,實現了各自的具體功能。
1.1、Object中的equals()方法:
講到equals()方法 我們先看下 "==" 與 equals()的區別:
==是一個比較運算符,對于基本數據類型來說,比較的是值;引用數據類型比較的是地址值(指是否為同一個對象的引用)(除非是同一個new出來的對象,==比較結果為true,否則均為false)。
equals()是一個方法,只能比較引用數據類型。重寫前比較的是地址值,重寫后一般是比較對象的屬性。
1.2、為什么要重寫equals()方法?
Object類中的equals()方法比較的是兩個對象的內存地址,對象之間比較內存地址一般是沒有意義的,所以我們一般會重寫equals()方法。
舉個栗子:
我們定義了一個學生類,學生的屬性為id和name,我們認為id和name都相同的情況下,他們的equals是true。但是當我們執行代碼 控制臺輸出的卻是false。不符合我們的需求,我們需要重寫equals()方法。
public class Student {
public Integer id;
public String name;
public Student(Integer id,String name){
this.id = id;
this.name = name;
}
public static void main(String[] args) {
Student s1 = new Student(1,"Rain");
Student s2 = new Student(1,"Rain");
System.out.println(s1.equals(s2));
}
}
1.3、如何重寫equals()方法?
原則:
1)自反性:對于任何非空引用X,X.equals(X)應該為true;
2)對稱性:對于任何引用X和Y,如果X.equals(Y)返回true,那么Y.equals(X)也應該返回true;
3)傳遞性:對于任何引用X,Y,Z,如果X.equals(Y)返回true,Y.equals(Z)返回true,那么X.equals(Z)也應該返回true;
4)一致性:如果X和Y引用的對象沒有發生變化,那么反復調用X.equals(Y)應該返回相同的結果;
5)非空性:對于任意非空引用X,X.equals(null)應該返回false。
一個栗子:
public class Coder {
public String name;
public int age;
public Coder(){}
public Coder(String name,int age){
this.name = name;
this.age = age;
}
public static void main(String[] args) {
Coder c1 = new Coder("R",26);
Coder c2 = new Coder("R",26);
System.out.println(c1.equals(c2));
}
public boolean equals(Object obj){
//判斷是否為同一對象
if(this == obj){
return true;
}
//判斷是否為null
if(null == obj){
return false;
}
//判斷兩者類型
if(this.getClass() != obj.getClass()){
return false;
}
//類型轉換
Coder coder = (Coder) obj;
//判斷數據
if(this.name.equals(coder.name) && this.age == coder.age){
return true;
}
return false;
}
}
因為重寫了equals()方法,控制臺輸出:true
2.1、Object中的hashCode()方法:
在java中,如果我們重寫了equals()方法,那么必定要重寫hashCode()方法。why?
首先我們需要知道hashCode的作用。java中hashCode的主要作用是 用增加哈希存儲結構(HashMap,HashTable之類)的查找速度,這些哈希存儲結構可以通過hashCode來確定對象在哈希存儲結構中的存儲位置。通過這句描述我們知道:
1)hashCode主要作用在于增加數據在哈希家族中的查找速度;
2)如果hashCode相等,它們在哈希結構中存儲位置相等,但是不是同一個對象。換句話說,hashCode相等,調用equals不一定相等;
3)如果equals相等,那么它們的存儲位置當然相等,所以hashCode一定是相等的;
那么為什么必須要重寫hashCode()方法呢?簡單來說,就是為了保證同一個對象,在equals相同的情況下hashCode值必定相同,如果重寫了equals()方法而未重寫hashCode()方法,可能就會出現兩個沒有關系的對象equals相同(因為equals都是根據對象的特征進行重寫的),但hashCode不同。
一個栗子:
//重寫hashCode()
public int hashCode(){
final int prime = 31; //為什么是31?因為這個數需要是質數 31是經 驗證的一個能夠很好的減少哈希碰撞的質數
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null)?0:name.hashCode());
return result;
}
3.1、Object中的getClass()方法:
getClass()方法返回對象所屬的類,是一個class對象。通過Class對象可以獲取該類的各種信息,包括類名、父類以及它所實現的接口名稱。
一個栗子:
public class Test02 {
public static void printClassInfo(Object obj){
System.out.println("類名:"+obj.getClass().getName());
System.out.println("父類:"+obj.getClass().getSuperclass().getName());
for(int i=0;i
System.out.println("實現的接口:"+obj.getClass().getInterfaces()[i]);
}
}
public static void main(String[] args) {
String strobj = new String();
printClassInfo(strobj);
}
}
控制臺輸出:
類名:java.lang.String
父類:java.lang.Object
實現的接口:interface java.io.Serializable
實現的接口:interface java.lang.Comparable
實現的接口:interface java.lang.CharSequence
OK,Object類的方法就介紹以上三個。
總結
以上是生活随笔為你收集整理的java public object_Java_Object的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《拳皇》被港漫带偏的名字,就连 SNK
- 下一篇: 微信朋友圈文字怎么不被折叠