首先說(shuō)一下繼承的好處:
1.提高了代碼的復(fù)用性
2.讓類和類之間產(chǎn)生了關(guān)系(關(guān)系是多態(tài)的前提)
將對(duì)像中的內(nèi)容不斷的向上抽取,就形成了關(guān)系,就有了繼承,就有父子類,提高了代碼的復(fù)用性。
繼承的特點(diǎn):
java語(yǔ)言當(dāng)中的繼承只能單繼承
單繼承:一個(gè)類只能有一個(gè)父類,可以理解為一個(gè)兒子只能有一個(gè)父親。
多繼承:一個(gè)類可以有多個(gè)父類,一個(gè)兒子有多個(gè)父親
下面簡(jiǎn)單用個(gè)例子來(lái)解釋一下:
class A{
void show(){
System.out.println(“show a.。?!保?
}
}
class B{
void show(){
System.out.println(“show b.。。.?!保?
}
}
class C extends A{} //這就是單繼承
class D extends A,B{
//這就是多繼承
D d = new D();
d.show();
}1234567891011121314151617
接下來(lái)來(lái)說(shuō)一下java不支持多繼承的原因:會(huì)產(chǎn)生調(diào)用的不確定性說(shuō)完了java不支持多繼承的原因再說(shuō)一下多繼承的好處:
同時(shí)繼承幾個(gè)類,就會(huì)有幾個(gè)類的方法
java改良了多繼承,雖然不支持多繼承,但是支持多重繼承,這樣就形成了繼承體系,如下所示
class A extends B{}
class B extends C{}
C
-----|B
-----|A12345
* 如何去使用一個(gè)繼承體系當(dāng)中的成員?*
1.查閱該體系頂層類的內(nèi)容,因?yàn)橥ㄟ^(guò)該類能夠了解到該繼承體系的基本功能
2.創(chuàng)建該子類的對(duì)象,既可以得到共性的功能,同時(shí)也包含子類特有的功能,簡(jiǎn)單的來(lái)說(shuō):看父類內(nèi)容,創(chuàng)建子類的對(duì)象
什么時(shí)候定義繼承?
1.不許是事務(wù)之間存在著所屬關(guān)系時(shí),才能定義繼承。
2.所屬關(guān)系:xxxx是zzzz當(dāng)中的一種,例如: 學(xué)生是人類當(dāng)中的一種,用英文翻譯就是 is a 的關(guān)系
誤區(qū):不要僅僅為了復(fù)用,為了獲得其他類當(dāng)中的內(nèi)容就去繼承
繼承在成員中的特點(diǎn):
1.成員變量
2.成員方法
3.構(gòu)造方法
繼承在成員變量中的用法
1.父類當(dāng)中包含的公有的屬性,子類都可以調(diào)用。
2.如果父類當(dāng)中包含的屬性的名稱和子類當(dāng)中包含的屬性的名稱相同了,并且在需要調(diào)用的方法中也有同名的變量名稱。
正常情況下,方法中會(huì)采用就近原則去獲取變量的值,如果想獲得子類的對(duì)象的屬性的值,就通過(guò)this調(diào)用,如果想獲得父類的屬性的值,就通過(guò)super來(lái)調(diào)用。
接下來(lái)說(shuō)一下super這個(gè)關(guān)鍵字:
super代表父類,它和this的用法是比較相似的。
this代表本類當(dāng)中對(duì)象的引用,super則代表父類所屬的空間。
一般情況下,如果父類中定義了一個(gè)屬性,子類中就不需要定義同名的屬性了,直接繼承就可以了。
子類只能直接的訪問(wèn)父類非私有的內(nèi)容,如果想要訪問(wèn)私有的內(nèi)容,就使用其他的方法。子類能訪問(wèn)的空間至少是兩片。
繼承在成員函數(shù)中的特點(diǎn):
* 當(dāng)父子類出現(xiàn)了一模一樣的方法時(shí),會(huì)產(chǎn)生一個(gè)函數(shù)的特性,名字叫做重寫(復(fù)寫,覆蓋)。
* 英文 Override
重寫的注意事項(xiàng):
* 1.子類重寫父類時(shí),必須要保證重寫方法的權(quán)限必須大于等于被重寫方法的權(quán)限。
* 權(quán)限修飾符權(quán)限的順序: private default protected public
* 2.重寫方法有靜態(tài)修飾時(shí),靜態(tài)只能重寫靜態(tài),或者被靜態(tài)重寫。
*
重寫和重載的區(qū)別
* 1.重寫override 重載是overload
* 2.重載要求在同一個(gè)類當(dāng)中。
* 重寫要求在父子類繼承關(guān)系中。
* 3.重載方法名相同,參數(shù)列表不同,返回值沒(méi)要求
* 重寫方法方法名相同,參數(shù)列表相同,返回值類型也相同
* 4.重載權(quán)限修飾符沒(méi)要求
* 重寫權(quán)限的要求:重寫方法的權(quán)限必須大于等于被重寫的方法的權(quán)限。
當(dāng)重寫一個(gè)方法時(shí),想保留原來(lái)的功能的同時(shí)還想新增加功能,
這時(shí)可以在重寫的方法中加入一句代碼:super.Xxx()—-》保留父類這個(gè)方法中的功能。
繼承在構(gòu)造函數(shù)當(dāng)中的特點(diǎn):
子類實(shí)例化的過(guò)程:
其實(shí)子類所有的構(gòu)造函數(shù),都有一條默認(rèn)的隱式語(yǔ)句,這個(gè)隱式語(yǔ)句就是super();
也就是說(shuō)子類的構(gòu)造函數(shù),都會(huì)默認(rèn)訪問(wèn)父類的空參的構(gòu)造函數(shù)。
為什么子類的構(gòu)造函數(shù)都要去默認(rèn)訪問(wèn)父類的空參的構(gòu)造函數(shù)?
因?yàn)樽宇惱^承了父類,可以訪問(wèn)父類當(dāng)中的一些屬性,在子類在進(jìn)行實(shí)例化的時(shí)候就必須為父類包含的屬性分配空間。
并且還要進(jìn)行初始化,所以就必須訪問(wèn)一次父類的構(gòu)造函數(shù),看看父類是如何對(duì)其屬性進(jìn)行初始化的。
所以子類要實(shí)例化對(duì)象時(shí),必須要先看看父類的初始化過(guò)程。
結(jié)論:父類的構(gòu)造函數(shù),既可以給本類的對(duì)象初始化,也可以給子類的對(duì)象初始化。
注意:如果父類中沒(méi)有空參數(shù)的構(gòu)造函數(shù),子類中的構(gòu)造函數(shù)必須手動(dòng)用super指定要訪問(wèn)的父類的構(gòu)造函數(shù)。
或者用this訪問(wèn)本類中的構(gòu)造函數(shù)。
this和super只能定義在構(gòu)造函數(shù)的第一行,而且不能同時(shí)出現(xiàn)。
說(shuō)完了super這個(gè)關(guān)鍵字,接下來(lái)再來(lái)說(shuō)一個(gè)關(guān)鍵字 final 這個(gè)關(guān)鍵字,
繼承的弊端:打破了封裝性。
final的特點(diǎn):
1.final是一個(gè)修飾符,它能夠修飾類,修飾方法,修飾變量。
2.final修飾的類不能被繼承
3.final修飾的方法不可以被重寫。
4.final修飾的變量是一個(gè)常量,只能被賦值一次。
舉個(gè)栗子:
final double PI = 3.1415;
final int ERROR = 1;
//標(biāo)識(shí)符中的規(guī)則:
被final修飾的變量的名稱一般采用全大寫1234
final和static通常是一起使用的。一旦成員變量設(shè)置為固定值,不可能因?yàn)閷?duì)象的改變而改變了,
通常就用static來(lái)修飾,final可以修飾局部變量,但是static只能修飾成員變量。
最后上張圖說(shuō)一下權(quán)限修飾符:
好了今天的內(nèi)容就講完了,完了咱們今天來(lái)做個(gè)小練習(xí):
首先說(shuō)一下需求:
寫一個(gè)person類,屬性包括 姓名、年齡、性別、書
方法:讀書
寫一個(gè)book類,屬性包括:書名、坐著、出版社、價(jià)格
寫一個(gè)測(cè)試類,創(chuàng)建一個(gè)person對(duì)象,執(zhí)行讀書的方法,查看結(jié)果
需要打印出來(lái)這個(gè)人讀的是什么書
例如:旺財(cái)正在讀一本由二狗子出版社出版的由張三寫的價(jià)值為50元的《java基礎(chǔ)》
package cxy;
//Book類
public class Book {
private String bookName;
private String author;
private String pressName;
private double price;
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getPressName() {
return pressName;
}
public void setPressName(String pressName) {
this.pressName = pressName;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public Book(String bookName, String author, String pressName, double price) {
super();
this.bookName = bookName;
this.author = author;
this.pressName = pressName;
this.price = price;
}
public Book(){
super();
}
}
1234567891011121314151617181920212223242526272829303132333435363738394041424344
Person 類
package cxy;
public class Person {
private String name;
private int age;
private String sex;
private Book book;
public void read(){
System.out.println(name+“正在讀一本由”+book.getPressName()+“出版的,由”+book.getAuthor()+“編寫的,價(jià)值為”+book.getPrice()+“元的《”+book.getBookName()+“》”);
}
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
}
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;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Person(String name, int age, String sex) {
super();
this.name = name;
this.age = age;
this.sex = sex;
}
public Person(){
super();
}
}
Test測(cè)試類
package cxy;
public class Test {
public static void main(String[] args) {
Book book = new Book(“java基礎(chǔ)”,“張三”,“二狗子教育出版社”,128.88);
Person person = new Person();
person.setName(“旺財(cái)”);
person.setBook(book);
person.read();
}
}
12345678910111213
最后是運(yùn)行結(jié)果:
評(píng)論
查看更多