11_常見對象(Object類的使用)


1:Eclipse的概述使用(掌握)
    請參照ppt和課堂練習.txt
    
2:API的概述(了解)
    (1)應用程序編程接口。
    (2)就是JDK提供給我們的一些提高編程效率的java類。

3:Object類(掌握)
    (1)Object是類層次結構的根類,所有的類都直接或者間接的繼承自Object類。
    (2)Object類的構造方法有一個,並且是無參構造
        這其實就是理解當時我們說過,子類構造方法默認訪問父類的構造是無參構造
    (3)要掌握的方法:
        A:toString()
            返回對象的字符串表示,默認是由類的全路徑+'@'+哈希值的十六進制表示。
            這個表示其實是沒有意義的,一般子類都會重寫該方法。
            如何重寫呢?過程我也講解過了,基本上就是要求信息簡單明了。
            但是最終還是自動生成。
        B:equals()
            比較兩個對象是否相同。默認情況下,比較的是地址值是否相同。
            而比較地址值是沒有意義的,所以,一般子類也會重寫該方法。
            重寫過程,我也詳細的講解和分析了。
            但是最終還是自動生成。
    (4)要了解的方法:
        A:hashCode() 返回對象的哈希值。不是實際地址值,可以理解為地址值。
        B:getClass() 返回對象的字節碼文件對象,反射中我們會詳細講解    
        C:finalize() 用於垃圾回收,在不確定的時間
        D:clone() 可以實現對象的克隆,包括成員變量的數據復制,但是它和兩個引用指向同一個對象是有區別的。
    (5)兩個注意問題;
        A:直接輸出一個對象名稱,其實默認調用了該對象的toString()方法。
        B:面試題
            ==和equals()的區別?
            A:==
                基本類型:比較的是值是否相同
                引用類型:比較的是地址值是否相同
            B:equals()
                只能比較引用類型。默認情況下,比較的是地址值是否相同。
                但是,我們可以根據自己的需要重寫該方法。

Object類概述:

package cn.itcast_01;
/*
 * Object: 類 Object 是類層次結構的根類。
 * 每個類都使用 Object 作為超類。每個類都直接或者間接繼承Object類.
 *  
 * 子類的構造方法默認訪問的是父類的無參構造方法。
 * 因為他們的共同的的根類是Object類
 * 
 * */

public class Student {

}

public int hashCode()方法:返回該對象的哈希碼值。

public final Class getClass():返回次Object的運行類。

package cn.itcast_01;

/*
 * Object:類 Object 是類層次結構的根類。每個類都使用 Object 作為超類。
 * 每個類都直接或者間接的繼承自Object類。
 * 
 * Object類的方法:
 *         public int hashCode():返回該對象的哈希碼值。
 *             注意:哈希值是根據哈希算法計算出來的一個值,這個值和地址值有關,但是不是實際地址值。
 *                        你可以理解為地址值。(這一般是通過將該對象的內部地址轉換成一個整數來實現的)
 * 
 *        public final Class getClass():返回此 Object 的運行時類
 *            Class類的方法:
 *                public String getName():以 String 的形式返回此 Class 對象所表示的實體
 */
public class StudentTest {
    public static void main(String[] args) {
        Student s1 = new Student();
        System.out.println(s1.hashCode()); //
        Student s2 = new Student();
        System.out.println(s2.hashCode());//
        Student s3 = s1;
        System.out.println(s3.hashCode()); // 
        System.out.println("-----------");

        Student s = new Student();
        Class c = s.getClass();
        String str = c.getName();
        System.out.println(str); // cn.itcast_01.Student
        
        //鏈式編程
        String str2  = s.getClass().getName();
        System.out.println(str2);
    }
}

/*
     32533955
    22549907
    -----------
    cn.itcast_01.Student
    cn.itcast_01.Student 
 * */

toString()方法:將對象轉換為字符串。

Student.java

package cn.itcast_02;

public class Student {
    private String name;
    private int age;

    public Student() {
        super();
    }

    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + "]";
    }

    // @Override
    // public String toString() {
    // // return super.toString();
    // // return "hello";
    // return "姓名:" + name + ",年齡:" + age;
    // }
    
    
}

StudentDemo.java

package cn.itcast_02;

/*
 * public String toString():返回該對象的字符串表示。
 * 
 * Integer類下的一個靜態方法:
 *         public static String toHexString(int i):把一個整數轉成一個十六進制表示的字符串
 * 
 * 這個信息的組成我們講解完畢了,但是這個信息是沒有任何意義的。所以,建議所有子類都重寫該方法。
 * 怎么重寫呢?
 *         把該類的所有成員變量值組成返回即可。
 * 
 * 重寫的最終版方案就是自動生成toString()方法。
 * Source ->Generater toString()
 * 
 * 注意:
 *      直接輸出一個對象的名稱,其實就是調用該對象的toString()方法。
 */
public class StudentDemo {
    public static void main(String[] args) {
        Student s = new Student();
        System.out.println(s.hashCode());
        System.out.println(s.getClass().getName());
        System.out.println("--------------------");
        System.out.println(s.toString());// cn.itcast_02.Student@42552c
        System.out.println("--------------------");
        // toString()方法的值等價於它
        // getClass().getName() + '@' + Integer.toHexString(hashCode())
        // this.getClass().getName()+'@'+Integer.toHexString(this.hashCode())

        // cn.itcast_02.Student@42552c
        // cn.itcast_02.Student@42552c

        System.out.println(s.getClass().getName() + '@'
                + Integer.toHexString(s.hashCode()));

        System.out.println(s.toString());

        // 直接輸出對象的名稱
        System.out.println(s);
    }
}

 

public boolean equals(Object obj):指示其他某個對象是否與此對象“相等”。
Student.java
package cn.itcast_03;

public class Student {
    private String name;
    private int age;

    public Student() {
        super();
    }

    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    //Eclipse自動產生Source -> Generate hashCode() and equals()
    
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        
        if (obj == null)
            return false;
        
        if (getClass() != obj.getClass())
            return false;
        
        Student other = (Student) obj;
        
        if (age != other.age)
            return false;
        
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }
    
//    @Override
//    public boolean equals(Object obj) {
//        // return true;
//        //這里要改進,根據這里比較的成員變量來決定返回true還是false
//        //這里其實要比價的就是name和age
//        //但是,name是String類型的,而String是引用類型的,所以,在這里不能直接用==比較,應該用equals()比較
//        //String的equals()方法是重寫自Object類的,比較的是字符串的內容是否相同
//        //this -- s1
//        //obj -- s2
//        //我們要使用的是學生類的特有成員變量,所以要向下轉型
//        Student s = (Student)obj; //s -- obj -- s2;
//        if(this.name.equals(s.name) && this.age == s.age) {
//            return true;
//        }else {
//            return false;
//        }
//    }
    
//    @Override
//    public boolean equals(Object obj) {
//        //為了提高效率
//        if(this == obj){
//            return true;
//        }
//        
//        //為了提供程序的健壯性
//        //我先判斷一下,obj是不是學生的一個對象,如果是,再做向下轉型,如果不是,直接返回false。
//        //這個時候,我們要判斷的是對象是否是某個類的對象?
//        //記住一個格式:對象名 instanceof 類名
//        //表示:判斷該對象名是否是該類名一個對象    (運算符:作用是判斷其左邊對象是否為其右邊類的實例)
//        if(!(obj instanceof Student)){
//            return false;
//        }
//        //如果是就繼續
//        
//        Student s = (Student)obj;
//        //System.out.println("同一個對象,還需要向下轉型並比較嗎?");
//        return this.name.equals(s.name) && this.age == s.age;
//    }
    
    
    
}

 

StudentDemo.java
package cn.itcast_03;

/*
 * public boolean equals(Object obj):指示其他某個對象是否與此對象“相等”。 
 * 這個方法,默認情況下比較的是地址值。比較地址值一般來說意義不大,所以我們要重寫該方法。
 * 怎么重寫呢?
 *         一般都是用來比較對象的成員變量值是否相同。
 * 重寫的代碼優化:提高效率,提高程序的健壯性。
 * 最終版:
 *         其實還是自動生成。
 * 
 * 看源碼:
 *         public boolean equals(Object obj) {
 *             //this - s1
 *             //obj - s2
 *           return (this == obj);
 *       }
 * 
 * ==:
 *         基本類型:比較的就是值是否相同
 *         引用類型:比較的就是地址值是否相同
 * equals:
 *         引用類型:默認情況下,比較的是地址值。
 *         不過,我們可以根據情況自己重寫該方法。一般重寫都是自動生成,比較對象的成員變量值是否相同
 *         //Eclipse自動產生Source -> Generate hashCode() and equals()
 */
public class StudentDemo {
    public static void main(String[] args) {
        Student s1 = new Student("林青霞", 27);
        Student s2 = new Student("林青霞", 27);
        System.out.println(s1 == s2); // false
        Student s3 = s1;
        System.out.println(s1 == s3);// true
        System.out.println("---------------");

        System.out.println(s1.equals(s2)); // obj = s2; //false
        System.out.println(s1.equals(s1)); // true
        System.out.println(s1.equals(s3)); // true
        Student s4 = new Student("風清揚",30);
        System.out.println(s1.equals(s4)); //false
        
        Demo d = new Demo();
        System.out.println(s1.equals(d)); //ClassCastException

    }
}

class Demo {}

 






protected void finalize():當垃圾回收器確定不存在對該對象的更多引用時,由對象的垃圾回收器調用此方法。
protected Object clone():創建並返回此對象的一個副本。“副本”的准確含義可能依賴於對象的類。
Student.java
package cn.itcast_04;

public class Student implements Cloneable {
    private String name;
    private int age;

    public Student() {
        super();
    }

    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

StudentDemo.java

package cn.itcast_04;

/*
 *    protected void finalize():當垃圾回收器確定不存在對該對象的更多引用時,由對象的垃圾回收器調用此方法。用於垃圾回收,但是什么時候回收不確定。
 *    protected Object clone():創建並返回此對象的一個副本。
 *        A:重寫該方法
 *
 *  Cloneable:此類實現了 Cloneable 接口,以指示 Object.clone() 方法可以合法地對該類實例進行按字段復制。 
 *      這個接口是標記接口,告訴我們實現該接口的類就可以實現對象的復制了。
 */
public class StudentDemo {
    public static void main(String[] args) throws CloneNotSupportedException {
        //創建學生對象
        Student s = new Student();
        s.setName("林青霞");
        s.setAge(27);
        
        //克隆學生對象
        Object obj = s.clone();
        Student s2 = (Student)obj;
        System.out.println("---------");
        
        System.out.println(s.getName()+"---"+s.getAge());
        System.out.println(s2.getName()+"---"+s2.getAge());
        
        //以前的做法
        Student s3 = s;
        System.out.println(s3.getName()+"---"+s3.getAge());
        System.out.println("---------");
        
        //其實是有區別的
        s3.setName("劉意");
        s3.setAge(30);
        System.out.println(s.getName()+"---"+s.getAge());
        System.out.println(s2.getName()+"---"+s2.getAge());
        System.out.println(s3.getName()+"---"+s3.getAge());
        
    }
}

/*
 * ---------
林青霞---27
林青霞---27
林青霞---27
---------
劉意---30
林青霞---27
劉意---30
*/

 






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM