Object類中的五種方法

clone()

Object類源碼:protected native Object clone() throws CloneNotSupportedException; 這裏有個問題:爲何Sun公司會用protected來修飾clone()方法呢,而不用public呢?有知道的朋友請指教 native表示該方法的實現不僅是經過java實現的,還用C、C++實現 克隆一個對象的方法 1.先覆蓋克隆方法 2.實現Cloneable接口 3.方法調用,拋出異常 ------------- public class ExecClone01{ //3.拋出異常 public static void main(String[] args) throws Exception{ Machine m1 = new Machine("Lenovo"); Machine m2 = m1.clone(); System.out.println(m1 == m2);//打印 false,說明克隆成功 System.out.println(m2.name);//打印 Lenovo } } //2.實現Cloneable()接口 class Machine implements Cloneable{ String name; public Machine(String name){ this.name = name; } //1.覆寫clone()方法,拋出異常 @Override public Machine clone() throws CloneNotSupportedException{//jdk5.0以後覆寫的返回類型能夠改變,可是必須是父類返回類型的子類類型->協變返回類型 Object obj = super.clone(); return (Machine)obj; } } ------------- public class ExecClone02 { //3.方法調用的時候須要拋出異常 public static void main(String[] args) throws CloneNotSupportedException{ OS o1 = new OS("Win10"); OS o2 = o1.clone(); System.out.println(o1 == o2); System.out.println(o2.name); } } //要求OS類能夠實現克隆 //2.實現一個接口: Cloneableclass OS implements Cloneable{ String name; public OS(String name){ this.name = name; } //1.先覆蓋clone()方法 ->拋出異常CloneNotSupportedException @Override public OS clone() throws CloneNotSupportedException{ Object obj = super.clone(); return (OS)obj; } } -------------java

finalize()

protected void finalize() throws Throwable {} 對象的"遺言"方法 當gc回收一個對象的時候,主動會調用這個對象的finalize方法 面試題:final和finalize之間的區別? final表示最終的 修飾符,能夠修飾類、方法、變量 finalize是Object類裏面的一個方法,當gc回收一個對象的時候會主動調用的一個方法程序員

toString()

public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } 用來制定打印一個對象,顯示的內容 當打印一個對象時,實際上打印的是該對象的toString方法,Object類自己打印對象,顯示 類型@XX,String類中覆蓋了Object類的toString方法,返回內容,因此打印出的是內容 ------------- public class Test01{ public static void main(String[] args){ Person p = new Person("王天二",22,'男',true); System.out.println(p); //XXX先生/女士 今年XXX歲 是個已婚/未婚人士 } } class Person{ String name; int age; char gender; boolean isMarry; public Person(String name,int age,char gender,boolean isMarry){ this.name = name; this.age = age; this.gender = gender; this.isMarry = isMarry; } @Override public String toString(){//當要進行較多拼接時,最好是採用StringBuffer進行拼接,效率更高 return name + (gender == '男'?"男士":"女士") + " 今年" + age + "歲" + " 是個" + (isMarry?"已婚":"未婚") + "人士"; } } -------------面試

equals()

public boolean equals(Object obj) { return (this == obj); } Object類自己比較的是兩個對象的地址 程序員能夠按照本身的意願將內存裏面不一樣的兩個對象視爲相等對象 -> 邏輯相等也就是說,制定一個類型比較的規則,當什麼條件成立的時候,能夠將兩個不一樣的對象視爲相等對象 Object類中equals()源代碼以下: //對象1.equals(對象2) public boolean equals(Object obj){//普通方法,須要用對象來調用 //this:當前調用equals方法的對象 //obj:表示參數傳來要參與比較的另外一個對象 //==:比較地址 return (this == obj); } ------------- public class ExecEquals01 { public static void main(String[] args){ Student stu1 = new Student("王天一",12,"A"); Student stu2 = new Student("陳浩南",24,"O"); Student stu3 = new Student("山雞",25,"A"); System.out.println(stu1.equals(stu2)); //打印 false System.out.println(stu1.equals(stu3)); //打印 true } } /** 定義一個Student類型 屬性:name age blood 建立對象時 完成全部屬性的賦值 只要兩個學生的血型同樣就視爲相等對象 */ class Student{ String name; int age; String blood; public Student(String name,int age,String blood){ this.name = name; this.age = age; this.blood = blood; } @Override public boolean equals(Object obj){//覆寫的條件 1.發生在有繼承關係的子類中 2.權限修飾符大於父類被覆寫方法權限修飾符;返回類型jdk5.0以前必須一致,jdk5.0以後能夠是父類方法返回類型的子類類型,稱爲協變返回類型;方法簽名(方法名和方法參數)必須一致 3.拋出異常的範圍必須小於父類被覆寫的方法拋出的異常 String blood1 = this.blood; String blood2 = ((Student)obj).blood; return blood1.equals(blood2); } } ------------- public class ExecEquals02 { public static void main(String[] args){ Food f1 = new Food("豆腐西施",12.5,"熱菜"); Food f2 = new Food("西紅柿炒雞蛋",12.5,"熱菜"); Food f3 = new Food("豆腐西施",12.5,"熱菜"); System.out.println(f1.equals(f2)); System.out.println(f1.equals(f3)); } } /** 定義一個Food類型 屬性:name price type 兩個菜的全部屬性同樣就視爲兩個對象相等 考慮一行實現 */ class Food{ String name; double price; String type; public Food(String name,double price,String type){ this.name = name; this.price = price; this.type = type; } @Override public boolean equals(Object obj){ return (this.name).equals(((Food)obj).name) && (this.price == ((Food)obj).price) && (this.type.equals(((Food)obj).type)); } } -------------ide

hashCode()

public native int hashCode(); 制定一個對象的散列特徵碼 散列:將一大組數據分散爲不一樣的小組 HashSet HashMap的底層是基於哈希表實現的 好比:將19 5 62 81 93 66分爲4組,能夠將每一個數對4取餘 x%4 [0] [1]93 81 5 [2]66 62 [3]19 注意:當equals()方法被重寫時,一般有必要重寫hashCode()方法,以維護 hashCode()方法的常規協定,該協定聲明相等對象必須具備相等的哈希碼 ---------- public class Test04 { public static void main(String[] args){ Teacher tea1 = new Teacher("二爺",10000.0,'女',true); Teacher tea2 = new Teacher("二爺",1232,'女',false); Teacher tea3 = new Teacher("二爺",10000.0,'女',true); System.out.println(tea1.equals(tea2)); //打印 false System.out.println(tea1.equals(tea3)); //打印 true System.out.println(tea1.hashCode()); //打印 685487 System.out.println(tea2.hashCode()); //打印 676718 System.out.println(tea3.hashCode()); //打印 685487 } } class Teacher{ String name; double salary; char gender; boolean isMarry; public Teacher(String name,double salary,char gender, boolean isMarry){ this.name = name; this.salary = salary; this.gender = gender; this.isMarry = isMarry; } @Override public boolean equals(Object obj){ if(obj == null)return false; if(!(obj instanceof Teacher))return false; if(obj == this)return true; return this.name.equals(((Teacher)obj).name)&& this.salary == (((Teacher)obj).salary)&& this.gender == (((Teacher)obj).gender)&& this.isMarry == (((Teacher)obj).isMarry); } @Override public int hashCode(){ return name.hashCode() + (int)salary + gender + (isMarry?1:0); } } -----------this

相關文章
相關標籤/搜索