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 */
