從屌絲到架構(gòu)師的飛越(面向?qū)ο笃?繼承

一、介紹

繼承是面向?qū)ο笞铒@著的一個(gè)特性。繼承是從已有的類中派生出新的類,新的類能吸收已有類的數(shù)據(jù)屬性和行為,并能擴(kuò)展新的能力。Java繼承是使用已存在的類的定義作為基礎(chǔ)建立新類的技術(shù),新類的定義可以增加新的數(shù)據(jù)或新的功能,也可以用父類的功能,但不能選擇性地繼承父類。這種技術(shù)使得復(fù)用以前的代碼非常容易,能夠大大縮短開發(fā)周期,降低開發(fā)費(fèi)用。

在面向?qū)ο蟪绦蛟O(shè)計(jì)中運(yùn)用繼承原則,就是在每個(gè)由一般類和特殊類形成的一般——特殊結(jié)構(gòu)中,把一般類的對象實(shí)例和所有特殊類的對象實(shí)例都共同具有的屬性和操作一次性地在一般類中進(jìn)行顯式的定義,在特殊類中不再重復(fù)地定義一般類中已經(jīng)定義的東西,但是在語義上,特殊類卻自動(dòng)地、隱含地?fù)碛兴囊话泐?以及所有更上層的一般類)中定義的屬性和操作。特殊類的對象擁有其一般類的全部或部分屬性與方法,稱作特殊類對一般類的繼承。

比如可以先定義一個(gè)類叫車,車有以下屬性:車體大小,顏色,方向盤,輪胎,而又由車這個(gè)類派生出轎車和卡車兩個(gè)類,為轎車添加一個(gè)小后備箱,而為卡車添加一個(gè)大貨箱。

二、知識點(diǎn)介紹

1、繼承概念

2、繼承的定義及使用格式

3、繼承注意事項(xiàng)

4、方法重寫

三、上課對應(yīng)視頻的說明文檔

1、繼承概念

1.1、繼承概述

繼承是面向?qū)ο蟮暮诵奶匦?,是面向?qū)ο蟮膶W(xué)習(xí)重點(diǎn)。同時(shí)繼承是代碼復(fù)用的重要方式,可以表示類與類之間的關(guān)系,是所有面向?qū)ο笳Z言不可缺少的組成部分。

1.2、繼承概念

當(dāng)一個(gè)類的屬性與行為均與現(xiàn)有類相似,屬于現(xiàn)有類的一種時(shí),這一個(gè)類可以定義為現(xiàn)有類的子類。

或者換成相反的角度來看,如果多個(gè)類具有相同的屬性和行為,我們可以抽取出共性的內(nèi)容定義父類,這時(shí)再創(chuàng)建相似的類時(shí)只要繼承父類即可。

子類擁有父類的所有屬性與方法,無需重新定義。并且可以直接使用非私有的父類成員。

從類與類之間的設(shè)計(jì)關(guān)系來看,子類必須屬于父類的一種時(shí),才會(huì)繼承。

我們在完成一個(gè)龐大項(xiàng)目體系的時(shí)候,都是將共性的內(nèi)容抽取出,后續(xù)構(gòu)建過程是從各種父類“向外”擴(kuò)散的。

下例展示了一個(gè)繼承關(guān)系

圖1-1 動(dòng)物繼承關(guān)系圖

動(dòng)物類可以有姓名、年齡的成員變量,可以有吃飯、睡覺的方法。

所有貓科與犬科均有動(dòng)物的成員變量與成員方法,且貓科與犬科均屬于動(dòng)物,所以貓科與全科均可以繼承動(dòng)物類。

貓科可以在動(dòng)物的基礎(chǔ)上再添加抓老鼠的方法

犬科可以在動(dòng)物的基礎(chǔ)上再添加看門的方法

犬科與貓科仍可以繼續(xù)出現(xiàn)子類,如波斯貓、巴厘貓、沙皮狗、斑點(diǎn)狗等,而其子類仍可以再出現(xiàn)該品種的特性。

2、繼承定義及使用格式

2.1、繼承定義

class 子類 extends 父類{

//父類的非私有方法與屬性均繼承過來

}

如:

父類的定義:

class Person{

private String name;

public void eat(){

System.out.println(“吃飯”);

}

get/set方法

}

子類繼承父類的定義:

class Chinese extends Person{}

2.2、繼承使用

繼承關(guān)系的產(chǎn)生通常是為了定義出功能更為具體、更為強(qiáng)大的子類。所以,定義子類后,一般創(chuàng)建子類對象使用。子類可以直接使用父類非私有的成員變量與成員方法

(注:如果成員變量沒有使用private修飾,則子類也可直接訪問。)

子類的使用:

class Test{

public static void main(String[] args) {

Chinese? c = new Chinese();

c.setName(“張大力”);

String name = c.getName();

System.out.println(name);//打印結(jié)果為張大力

c.eat();? //打印結(jié)果吃飯

}

3、繼承注意事項(xiàng)

Java只支持單繼承,不支持多繼承。即只能有一個(gè)父類。

父類可以繼續(xù)有父類。

所有類均有父類,只有Object類沒有父類。

在所有使用父類類型的地方均可以傳入其子類對象。

/*

* Animal的類

* 屬性

*? ? ? ? name

*? ? ? ? age

* 行為

*? ? ? ? 吃

*? ? ? ? 睡

*/

public class Animal {

//成員變量

private String name;

private int age;

// //吃

// public abstract void eat(){

//? ? System.out.println(“吃”);

//? ? }

//睡

public void sleep(){

System.out.println("睡");

}

//-----------get/set-------------------

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;

}

}

/*

*定義一個(gè)貓類

* 屬性

*? name?

*? age

*? kind

* 行為

*? 吃

*? 睡

*? 抓老鼠

*/

public class Cat extends Animal{

private String kind;

// @Override

// public void eat(){

//? System.out.println("貓吃魚");

// }

//貓?zhí)赜械墓δ? 抓老鼠

public void catchMouse(){

System.out.println("抓耗子");

}

public String getKind() {

return kind;

}

public void setKind(String kind) {

this.kind = kind;

}

}

/*

*定義一個(gè)狗類

* 屬性

*? name?

*? age

*? kind

* 行為

*? 吃

*? 睡

*? 看門

*/

public class Dog extends Animal{

private String kind;

// @Override

// public void eat(){

//? System.out.println("狗吃肉");

// }

//狗特有功能? 看門

public void lookDoor(){

System.out.println("看門");

}

public String getKind() {

return kind;

}

public void setKind(String kind) {

this.kind = kind;

}

}

/*

* 自定義類型 家

*

*? 地址

*

* 行為

*? 在家吃飯

*/

public class Home {

private String address;

//動(dòng)物在家吃飯

//在所有使用父類類型的地方均可以傳入其子類對象。

public void eatAtHome(Animal a){

//調(diào)用Animal的eat方法

//a.eat();?

}

//狗在在家吃飯

// public void eatAtHome(Dog dog){

//? System.out.println("狗在家吃了");

//? //調(diào)用狗的eat方法

//? dog.eat();

// }

//貓?jiān)诩页燥?/p>

// public void eatAtHome(Cat cat){

//? System.out.println("貓?jiān)诩俪粤?);

//? //調(diào)用貓的eat方法

//? cat.eat();

// }

public String getAddress() {

return address;

}

public void setAddress(String address) {

this.address = address;

}

}

/**

* 測試家類

*/

public class Test {

public static void main(String[] args) {

//? 創(chuàng)建Home對象

Home home = new? Home();

//? Animal a = new Animal();?

//? home.eatAtHome(a);?

//在所有使用父類類型的地方均可以傳入其子類對象。

Dog d = new Dog();

home.eatAtHome(d);

Cat c = new Cat();

home.eatAtHome(c);?

}

}

4、方法重寫

4.1、方法重寫概念

當(dāng)子類繼承父類后,擁有了父類的成員并可以直接調(diào)用父類非私有方法。如果子類認(rèn)為父類提供的方法不夠強(qiáng)大,子類可以按照子類自身的邏輯重新定義繼承過來的父類方法,這個(gè)重新定義一個(gè)方法的過程叫做方法重寫。

(注:在學(xué)習(xí)完多態(tài)和抽象類后我們會(huì)對方法重寫有更深的理解)

4.2、方法重寫格式

子類中定義與父類一樣的方法便將父類的方法重寫了。此時(shí),當(dāng)創(chuàng)建子類對象,調(diào)用方法時(shí),會(huì)調(diào)用子類重寫后的方法。如:

子類中定義與父類一樣的方法聲明即是方法重寫。

如:

父類定義:

public class Person{

private String name;

public void eat(){

System.out.println(“吃飯”);

}

get/set

}

子類定義:

public class Chinese extends Person{

@override //@override是用于強(qiáng)制規(guī)定當(dāng)前定義的方法一定為重寫的方法

public void eat() {

System.out.println(“按照中國的習(xí)慣,使用筷子吃”);

}

}

子類的使用:

public class Test{

public static void main(String[] args) {

Chinese? c = new Chinese();

c.setName(“張大力”);? //父類繼承方法直接調(diào)用

String name = c.getName(); //父類繼承方法直接調(diào)用

System.out.println(name); //打印結(jié)果為張大力

c.eat();? //方法重寫后調(diào)用的為重寫后的方法

//打印結(jié)果:按照中國的習(xí)慣,使用筷子吃

}

}

/**

* 自定義類型? 人類

*

*? ? 姓名? 年齡

*/

public class Person {

String address;

private String name;

private int age;

public void eat(){

System.out.println("吃");? ?

}

public void sleep(){

System.out.println("睡");

}

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;

}

}

/*

* 定義類型? 學(xué)生類

*

* 姓名? 年齡

*

* 繼承

*? 概念1? 當(dāng)定義一個(gè)類時(shí),發(fā)現(xiàn)現(xiàn)有類與要定義的類類似,并且要定義的類屬于現(xiàn)有類的一種時(shí),

*? 就可以將這個(gè)類定義為現(xiàn)有類的子類

*?

*? 子類擁有父類的所有屬性與方法,無需重新定義。并且可以直接使用非私有的父類成員。

*?

*? 父類私用的成員變量? 可以使用get/set方法 訪問

*? 父類私有的方法? 沒有辦法直接方法? 雖然繼承了 但是相當(dāng)于沒有

*? ?

*? 子類可以有自己特有的屬性和方法

*?

*? 方法重寫

*? ? 子類繼承父類后,可以直接使用父類的非私有成員,但是如果覺得父類的成員方法不夠強(qiáng)大,子類可以按照自身的邏輯

*? ? 將繼承過來的父類方法,進(jìn)行重寫(方法重寫,方法復(fù)寫,方法覆蓋)

*?

*? 可以使用@Override來驗(yàn)證你的方法是不是重寫方法。

*/

public class Student extends Person{

private String number;

public void method(){

System.out.println(address);

System.out.println(getName());

}

//重寫父類eat方法

@Override

public void eat(){

System.out.println("學(xué)生吃學(xué)生套餐");

}

public String getNumber() {

return number;

}

public void setNumber(String number) {

this.number = number;

}

}

/*

* 測試?yán)^承后的Studnet

*/

public class Test {

public static void main(String[] args) {

//創(chuàng)建Studnet對象

Student s = new Student();

s.setName("柳柳");

s.setNumber("0900112");

s.eat();

//? s.sleep();

String name = s.getName();

System.out.println(name);

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

System.out.println("-----------------");

//子類調(diào)用自己特有的方法

s.method();?

}

}

4.3、Java中方法重寫規(guī)則

子類重寫方法時(shí),在聲明前加@Override可檢測該方法是否為重寫的方法

訪問權(quán)限相同或子類方法訪問權(quán)限更大(訪問權(quán)限順序public>默認(rèn))

class Fu{

void show(){}

public void method(){}

}

class Zi extends Fu{

public void show(){}? //編譯運(yùn)行沒問題

void method(){}? ? ? //編譯錯(cuò)誤

}

方法名稱必須相同

參數(shù)列表必須相同

返回值為基本類型時(shí)必須相同

返回值為引用類型時(shí)相同或子類小(了解)

/*

* 方法重寫的注意事項(xiàng)

*? 子類重寫方法時(shí),在聲明前加@Override可檢測該方法是否為重寫的方法

*? 訪問權(quán)限相同或子類方法訪問權(quán)限更大(訪問權(quán)限順序public>默認(rèn))

*? 方法名稱必須相同

*? 參數(shù)列表必須相同

*? 返回值為基本類型時(shí)必須相同

*? 返回值為引用類型時(shí)相同或子類小(了解)

*/

public class Fu {

public void method(){

System.out.println(" 父類方法");

}

public int sum(){

return 0;

}

public Person get(){

return null;

}

}

public class Zi extends Fu{

//訪問權(quán)限相同或子類方法訪問權(quán)限更大(訪問權(quán)限順序public>默認(rèn))

@Override

public void method(){

System.out.println("子類方法");

}

//返回值為基本類型時(shí)必須相同

@Override

public int sum(){

return 100;

}

//返回值為引用類型時(shí)相同或子類小(了解)

@Override

public Student get(){

return null;

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容