Java 類的特性1
繼承
1.為什么要有繼承?
多個類中存在相同屬性和行為時,將這些內容抽取到單獨一個類中,那么多個類無需再定義這些屬性和行為,只要繼承那個類即可。
2.此處的多個類稱為子類,單獨的這個類稱為父類(基類或超類)。可以理解為:“子類 is-a 父類”
3.類繼承語法規則: class Subclass extends Superclass{}
4.作用:
- 繼承的出現提高了代碼的復用性。
- 繼承的出現讓類與類之間產生了關系,提供了多態的前提。
- 不要僅為了獲取其他類中某個功能而去繼承
5.關于繼承的規則:子類不能直接訪問父類中私有的(private)的成員變量和方法、Java只支持單繼承,不允許多重繼承
方法的重寫(override)
1.定義:在子類中可以根據需要對從父類中繼承來的方法進行改造,也稱方法的重置、覆蓋。在程序執行時,子類的方法將覆蓋父類的方法。
2.要求:
重寫方法必須和被重寫方法具有相同的方法名稱、參數列表和返回值類型。
重寫方法不能使用比被重寫方法更嚴格的訪問權限。
重寫和被重寫的方法須同時為static的,或同時為非static的
子類方法拋出的異常不能大于父類被重寫方法的異常
public class Person {public String name;public int age;public String getInfo() {return "Name: "+ name + "\n" +"age: "+ age;} } public class Student extends Person {public String school;public String getInfo() { //重寫方法return "Name: "+ name + "\nage: "+ age + "\nschool: "+ school;}public static void main(String args[]){Student s1=new Student();s1.name="Bob";s1.age=20;s1.school="school2";System.out.println(s1.getInfo()); //Name:Bob age:20 school:school2} }
關鍵字–super
1.在Java類中使用super來調用父類中的指定操作:
- super可用于訪問父類中定義的屬性
- super可用于調用父類中定義的成員方法
- super可用于在子類構造方法中調用父類的構造器
2.注意:
- 尤其當子父類出現同名成員時,可以用super進行區分
- super的追溯不僅限于直接父類
- super和this的用法相像,this代表本類對象的引用,super代表父類的內存空間的標識
調用父類的構造器
- 子類中所有的構造器默認都會訪問父類中空參數的構造器
- 當父類中沒有空參數的構造器時,子類的構造器必須通過this(參數列表)或者super(參數列表)語句指定調用本類或者父類中相應的構造器,且必須放在構造器的第一行
- 如果子類構造器中既未顯式調用父類或本類的構造器,且父類中又沒有無參的構造器,則編譯出錯
this和super的區別
No. | 區別點 | this | super |
---|---|---|---|
1 | 訪問屬性 | 訪問本類中的屬性,如果本類沒有此屬性則從父類中繼續查找 | 訪問父類中的屬性 |
2 | 調用方法 | 訪問本類中的方法 | 直接訪問父類中的方法 |
3 | 調用構造器 | 調用本類構造器,必須放在構造器的首行 | 調用父類構造器,必須放在子類構造器的首行 |
4 | 特殊 | 表示當前對象 | 無此概念 |
多態性
兩種體現:
- 方法的重載(overload)和重寫(overwrite)。
- 對象的多態性——可以直接應用在抽象類和接口上。
1.對象的多態—在Java中,子類的對象可以替代父類的對象使用
- 一個變量只能有一種確定的數據類型
一個引用類型變量可能指向(引用)多種不同類型的對象
Person p = new Student();
Object o = new Person();//Object類型的變量o,指向Person類型的對象
o =new Student(); //Object類型的變量o,指向Student類型的對象
子類可看做是特殊的父類,所以父類類型的引用可以指向子類的對象:向上轉型(upcasting)。
2.一個引用類型變量如果聲明為父類的類型,但實際引用的是子類對象,那么該變量就不能再訪問子類中添加的屬性和方法。
Student m = new Student();
m.school = “pku”; //合法,Student類有school成員變量
Person e = new Student();
e.school = “pku”; //非法,Person類沒有school成員變量
屬性是在編譯時確定的,編譯時e為Person類型,沒有school成員變量,因而編譯錯誤。
對象類型轉換 (Casting )
1、基本數據類型的Casting:
- 自動類型轉換:小的數據類型可以自動轉換成大的數據類型
? 如long g=20; double d=12.0f
- 強制類型轉換:可以把大的數據類型強制轉換(casting)成小的數據類型
? 如 float f=(float)12.0; int a=(int)1200L
2、對Java對象的強制類型轉換稱為造型
- 從子類到父類的類型轉換可以自動進行
- 從父類到子類的類型轉換必須通過造型(強制類型轉換)實現
- 無繼承關系的引用類型間的轉換是非法的
- 在造型前可以使用instanceof操作符測試一個對象的類型
public class ConversionTest{public static void main(String[] args) {double d = 13.4;long l = (long)d;System.out.println(l);int in = 5;//boolean b = (boolean)in;Object obj = "Hello";String objStr = (String)obj;System.out.println(objStr);Object objPri = new Integer(5);//所以下面代碼運行時引發ClassCastException異常String str = (String)objPri;}
}
Object 類
1、Object類是所有Java類的根父類
2、如果在類的聲明中未使用extends關鍵字指明其父類,則默認父類為Object類
publicclass Person {
…
}
等價于:
public class Person extendsObject {
…
}
3、例:method(Objectobj){…}//可以接收任何類作為其參數
? Person o=newPerson();
? method(o);
4、Object的主要方法
NO. | 方法名稱 | 類型 | 描述 |
---|---|---|---|
1 | public Object() | 構造 | 構造方法 |
2 | public boolean equals(Object obj) | 普通 | 對象比較 |
3 | public int hashCode() | 普通 | 取得Hash碼 |
4 | public String toString() | 普通 | 對象打印時調用 |
==操作符與equals方法
1、= =:
基本類型比較值:只要兩個變量的值相等,即為true.
int a=5; if(a==6){…}
引用類型比較引用(是否指向同一個對象):只有指向同一個對象時,==才返回true.
Personp1=new Person();
Person p2=new Person();
if (p1==p2){…}
ps:用“==”進行比較時,符號兩邊的數據類型必須兼容(可自動轉換的基本數據類型除外),否則編譯出錯;
2、equals():所有類都繼承了Object,也就獲得了equals()方法。還可以重寫。
- 只能比較引用類型,其作用與“==”相同,比較是否指向同一個對象。
- 格式:obj1.equals(obj2)
- 特例:當用equals()方法進行比較時,對類File、String、Date及包裝類(WrapperClass)來說,是比較類型及內容而不考慮引用的是否是同一個對象;
- 原因:在這些類中重寫了Object類的equals()方法。
toString() 方法
1、toString()方法在Object類中定義,其返回值是String類型,返回類名和它的引用地址。
2、在進行String與其它類型數據的連接操作時,自動調用toString()方法
Date now=new Date();
System.out.println(“now=”+now); 相當于
System.out.println(“now=”+now.toString());
3、可以根據需要在用戶自定義類型中重寫toString()方法
如String類重寫了toString()方法,返回字符串的值。
s1=“hello”;
System.out.println(s1);//相當于System.out.println(s1.toString());
4、基本類型數據轉換為String類型時,調用了對應包裝類的toString()方法
inta=10; System.out.println(“a=”+a);