Java 类的特性1
Java 類的特性1
繼承
1.為什么要有繼承?
多個類中存在相同屬性和行為時,將這些內(nèi)容抽取到單獨(dú)一個類中,那么多個類無需再定義這些屬性和行為,只要繼承那個類即可。
2.此處的多個類稱為子類,單獨(dú)的這個類稱為父類(基類或超類)??梢岳斫鉃?“子類 is-a 父類”
3.類繼承語法規(guī)則: class Subclass extends Superclass{}
4.作用:
- 繼承的出現(xiàn)提高了代碼的復(fù)用性。
- 繼承的出現(xiàn)讓類與類之間產(chǎn)生了關(guān)系,提供了多態(tài)的前提。
- 不要僅為了獲取其他類中某個功能而去繼承
5.關(guān)于繼承的規(guī)則:子類不能直接訪問父類中私有的(private)的成員變量和方法、Java只支持單繼承,不允許多重繼承
方法的重寫(override)
1.定義:在子類中可以根據(jù)需要對從父類中繼承來的方法進(jìn)行改造,也稱方法的重置、覆蓋。在程序執(zhí)行時,子類的方法將覆蓋父類的方法。
2.要求:
重寫方法必須和被重寫方法具有相同的方法名稱、參數(shù)列表和返回值類型。
重寫方法不能使用比被重寫方法更嚴(yán)格的訪問權(quán)限。
重寫和被重寫的方法須同時為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} }
關(guān)鍵字–super
1.在Java類中使用super來調(diào)用父類中的指定操作:
- super可用于訪問父類中定義的屬性
- super可用于調(diào)用父類中定義的成員方法
- super可用于在子類構(gòu)造方法中調(diào)用父類的構(gòu)造器
2.注意:
- 尤其當(dāng)子父類出現(xiàn)同名成員時,可以用super進(jìn)行區(qū)分
- super的追溯不僅限于直接父類
- super和this的用法相像,this代表本類對象的引用,super代表父類的內(nèi)存空間的標(biāo)識
調(diào)用父類的構(gòu)造器
- 子類中所有的構(gòu)造器默認(rèn)都會訪問父類中空參數(shù)的構(gòu)造器
- 當(dāng)父類中沒有空參數(shù)的構(gòu)造器時,子類的構(gòu)造器必須通過this(參數(shù)列表)或者super(參數(shù)列表)語句指定調(diào)用本類或者父類中相應(yīng)的構(gòu)造器,且必須放在構(gòu)造器的第一行
- 如果子類構(gòu)造器中既未顯式調(diào)用父類或本類的構(gòu)造器,且父類中又沒有無參的構(gòu)造器,則編譯出錯
this和super的區(qū)別
| 1 | 訪問屬性 | 訪問本類中的屬性,如果本類沒有此屬性則從父類中繼續(xù)查找 | 訪問父類中的屬性 |
| 2 | 調(diào)用方法 | 訪問本類中的方法 | 直接訪問父類中的方法 |
| 3 | 調(diào)用構(gòu)造器 | 調(diào)用本類構(gòu)造器,必須放在構(gòu)造器的首行 | 調(diào)用父類構(gòu)造器,必須放在子類構(gòu)造器的首行 |
| 4 | 特殊 | 表示當(dāng)前對象 | 無此概念 |
多態(tài)性
兩種體現(xiàn):
- 方法的重載(overload)和重寫(overwrite)。
- 對象的多態(tài)性——可以直接應(yīng)用在抽象類和接口上。
1.對象的多態(tài)—在Java中,子類的對象可以替代父類的對象使用
- 一個變量只能有一種確定的數(shù)據(jù)類型
一個引用類型變量可能指向(引用)多種不同類型的對象
Person p = new Student();
Object o = new Person();//Object類型的變量o,指向Person類型的對象
o =new Student(); //Object類型的變量o,指向Student類型的對象
子類可看做是特殊的父類,所以父類類型的引用可以指向子類的對象:向上轉(zhuǎn)型(upcasting)。
2.一個引用類型變量如果聲明為父類的類型,但實(shí)際引用的是子類對象,那么該變量就不能再訪問子類中添加的屬性和方法。
Student m = new Student();
m.school = “pku”; //合法,Student類有school成員變量
Person e = new Student();
e.school = “pku”; //非法,Person類沒有school成員變量
屬性是在編譯時確定的,編譯時e為Person類型,沒有school成員變量,因而編譯錯誤。
對象類型轉(zhuǎn)換 (Casting )
1、基本數(shù)據(jù)類型的Casting:
- 自動類型轉(zhuǎn)換:小的數(shù)據(jù)類型可以自動轉(zhuǎn)換成大的數(shù)據(jù)類型
? 如long g=20; double d=12.0f
- 強(qiáng)制類型轉(zhuǎn)換:可以把大的數(shù)據(jù)類型強(qiáng)制轉(zhuǎn)換(casting)成小的數(shù)據(jù)類型
? 如 float f=(float)12.0; int a=(int)1200L
2、對Java對象的強(qiáng)制類型轉(zhuǎn)換稱為造型
- 從子類到父類的類型轉(zhuǎn)換可以自動進(jìn)行
- 從父類到子類的類型轉(zhuǎn)換必須通過造型(強(qiáng)制類型轉(zhuǎn)換)實(shí)現(xiàn)
- 無繼承關(guān)系的引用類型間的轉(zhuǎn)換是非法的
- 在造型前可以使用instanceof操作符測試一個對象的類型
Object 類
1、Object類是所有Java類的根父類
2、如果在類的聲明中未使用extends關(guān)鍵字指明其父類,則默認(rèn)父類為Object類
publicclass Person {
…
}
等價于:
public class Person extendsObject {
…
}
3、例:method(Objectobj){…}//可以接收任何類作為其參數(shù)
? Person o=newPerson();
? method(o);
4、Object的主要方法
| 1 | public Object() | 構(gòu)造 | 構(gòu)造方法 |
| 2 | public boolean equals(Object obj) | 普通 | 對象比較 |
| 3 | public int hashCode() | 普通 | 取得Hash碼 |
| 4 | public String toString() | 普通 | 對象打印時調(diào)用 |
==操作符與equals方法
1、= =:
基本類型比較值:只要兩個變量的值相等,即為true.
int a=5; if(a==6){…}
引用類型比較引用(是否指向同一個對象):只有指向同一個對象時,==才返回true.
Personp1=new Person();
Person p2=new Person();
if (p1==p2){…}
ps:用“==”進(jìn)行比較時,符號兩邊的數(shù)據(jù)類型必須兼容(可自動轉(zhuǎn)換的基本數(shù)據(jù)類型除外),否則編譯出錯;
2、equals():所有類都繼承了Object,也就獲得了equals()方法。還可以重寫。
- 只能比較引用類型,其作用與“==”相同,比較是否指向同一個對象。
- 格式:obj1.equals(obj2)
- 特例:當(dāng)用equals()方法進(jìn)行比較時,對類File、String、Date及包裝類(WrapperClass)來說,是比較類型及內(nèi)容而不考慮引用的是否是同一個對象;
- 原因:在這些類中重寫了Object類的equals()方法。
toString() 方法
1、toString()方法在Object類中定義,其返回值是String類型,返回類名和它的引用地址。
2、在進(jìn)行String與其它類型數(shù)據(jù)的連接操作時,自動調(diào)用toString()方法
Date now=new Date();
System.out.println(“now=”+now); 相當(dāng)于
System.out.println(“now=”+now.toString());
3、可以根據(jù)需要在用戶自定義類型中重寫toString()方法
如String類重寫了toString()方法,返回字符串的值。
s1=“hello”;
System.out.println(s1);//相當(dāng)于System.out.println(s1.toString());
4、基本類型數(shù)據(jù)轉(zhuǎn)換為String類型時,調(diào)用了對應(yīng)包裝類的toString()方法
inta=10; System.out.println(“a=”+a);
總結(jié)
以上是生活随笔為你收集整理的Java 类的特性1的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tkinter 界面设计工具
- 下一篇: Java 类的特性2