




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、能力目標:能力目標:n理解類的繼承,能編寫類及其派生子類。理解類的繼承,能編寫類及其派生子類。n理解多態(tài)含義,理解上轉(zhuǎn)型對象,能在子類中重寫父理解多態(tài)含義,理解上轉(zhuǎn)型對象,能在子類中重寫父類的同名方法。類的同名方法。n能運用繼承與多態(tài)編寫人類派生學生類、動物類派生能運用繼承與多態(tài)編寫人類派生學生類、動物類派生馬類等程序。馬類等程序。1n8.1 任務(wù)預覽任務(wù)預覽n8.2 繼承與派生繼承與派生n8.3 用用protected聲明受保護成員聲明受保護成員n8.4 關(guān)鍵字關(guān)鍵字supern8.5 類類型變量賦值類類型變量賦值n8.6 多態(tài)性多態(tài)性n8.7 本章小結(jié)本章小結(jié)n8.8 實訓實訓8:人類派生
2、與動物類派生:人類派生與動物類派生2n本章實訓程序運行結(jié)果:本章實訓程序運行結(jié)果: 3n本章實訓程序運行結(jié)果:本章實訓程序運行結(jié)果: 4n計算機世界與自然界一樣,類之間也有繼承和派生關(guān)系。計算機世界與自然界一樣,類之間也有繼承和派生關(guān)系。n運用繼承與派生能達到運用繼承與派生能達到代碼重用、簡化編程代碼重用、簡化編程的目的。的目的。n語法:語法: 可選可選public 可選可選abstract 可選可選final class 子類子類 extends 父類父類 . n子類子類繼承繼承父類,父類父類,父類派生派生子類。子類。5n類的單一繼承關(guān)系類的單一繼承關(guān)系l一個類只能有一個父類一個類只能有一個
3、父類l一個父類可以派生多個子類一個父類可以派生多個子類n形成了清晰的層次結(jié)構(gòu),樹狀圖如下:形成了清晰的層次結(jié)構(gòu),樹狀圖如下: 6nObject類類l所有類的祖先類所有類的祖先類l在在java.lang包中包中l(wèi)所有類直接或間接繼承所有類直接或間接繼承Object類類l若沒有顯示繼承別的類,則默認繼承若沒有顯示繼承別的類,則默認繼承Object類:類: class Human extends Object lObject類的非私有成員通過派生成為個各類的成員類的非私有成員通過派生成為個各類的成員toString方法方法equals方法方法7class Human1 /人類人類protected
4、String name; protected char sex; protected int age; public Human1(String name, char sex, int age) = name; this.sex = sex; this.age = age;public void think() /思考方法思考方法 System.out.println(name + 在思考在思考.); 9class Pupil1 extends Human1 /繼承人類的學生類繼承人類的學生類 protected String stuNo; /學號學號public Pupi
5、l1(String stuNo, String name, char sex, int age) super(name, sex, age); this.stuNo = stuNo;public void learn() /學習方法學習方法 System.out.println(getName() + ”在學習在學習”); 10public class Example1 /程序入口類程序入口類public static void main(String args) Human1 person = new Human1(林沖林沖, 男男, 30);person.think(); System.o
6、ut.println();Pupil1 aPupil = new Pupil1(001, 李明李明, 男男, 6);aPupil.think(); aPupil.learn();11n關(guān)鍵字關(guān)鍵字protected可修飾類的字段和方法,這些成員能被所可修飾類的字段和方法,這些成員能被所有派生子類直接或間接繼承。有派生子類直接或間接繼承。nprotected修飾的類成員,還能被類所在的包訪問。修飾的類成員,還能被類所在的包訪問。n在例在例8-1中,使用了關(guān)鍵字中,使用了關(guān)鍵字protected修飾人類修飾人類Human1的的name、sex和和age字段。字段。12class Human1 /人
7、類人類protected String name; protected char sex; protected int age; public Human1(String name, char sex, int age) = name; this.sex = sex; this.age = age;public void think() /思考方法思考方法 System.out.println(name + 在思考在思考.); 13n關(guān)鍵字關(guān)鍵字protected可修飾類的字段和方法,這些成員能被所可修飾類的字段和方法,這些成員能被所有派生子類直接或間接繼承。有派生子類直接
8、或間接繼承。nprotected修飾的類成員,還能被類所在的包訪問。修飾的類成員,還能被類所在的包訪問。n在例在例8-1中,使用了關(guān)鍵字中,使用了關(guān)鍵字protected修飾人類修飾人類Human1的的name、sex和和age字段。字段。n雖然雖然protected可以修飾字段,但類的封裝性要求除了可以修飾字段,但類的封裝性要求除了final常量字段外,其它字段一律應(yīng)為常量字段外,其它字段一律應(yīng)為private。故不可濫用。故不可濫用protected修飾字段。修飾字段。14class Human2 private String name; private char sex; private
9、 int age;public Human2(String name, char sex, int age) protected String getName() public void think() class Pupil2 extends Human2 private String stuNo; public Pupil2() public void learn() public class Example2 public static void main(String args) Human2 person = new Human2(林沖林沖, 男男, 30);person.think
10、(); Pupil2 aPupil = new Pupil2(001, 李明李明, 男男, 6);aPupil.think(); aPupil.learn(); 15n雖然雖然protected可以修飾字段,但類的封裝性要求除了可以修飾字段,但類的封裝性要求除了final常量字段外,其它字段一律應(yīng)為常量字段外,其它字段一律應(yīng)為private。故不可濫用。故不可濫用protected修飾字段。修飾字段。n例例8-2中,調(diào)用了中,調(diào)用了Pupil2的構(gòu)造方法創(chuàng)建一個學生對象,使的構(gòu)造方法創(chuàng)建一個學生對象,使用了用了name等字段等字段l這些字段是父類這些字段是父類Human2的私有字段的私有字段l
11、但通過調(diào)用非私有方法但通過調(diào)用非私有方法getName,可間接被學生對象訪問,可間接被學生對象訪問Protected String getName() return name; n子類對象包含了父類對象的內(nèi)核,即使是父類的私有成員,子類對象包含了父類對象的內(nèi)核,即使是父類的私有成員,也在這個內(nèi)核之中也在這個內(nèi)核之中16n類如果沒有顯式聲明構(gòu)造方法,則自動生成無參數(shù)的默認構(gòu)類如果沒有顯式聲明構(gòu)造方法,則自動生成無參數(shù)的默認構(gòu)造方法。造方法。n子類的構(gòu)造方法總是先調(diào)用父類的構(gòu)造方法子類的構(gòu)造方法總是先調(diào)用父類的構(gòu)造方法n當調(diào)用子類的構(gòu)造方法創(chuàng)建對象時,首先執(zhí)行父類的構(gòu)造方當調(diào)用子類的構(gòu)造方法創(chuàng)建對
12、象時,首先執(zhí)行父類的構(gòu)造方法,然后才執(zhí)行子類的構(gòu)造方法法,然后才執(zhí)行子類的構(gòu)造方法17class Human3 public Human3() System.out.println(構(gòu)造了一個人構(gòu)造了一個人); class Pupil3 extends Human3 public Pupil3()/super(); /相當于執(zhí)行了本語句相當于執(zhí)行了本語句System.out.println(構(gòu)造了一個學生構(gòu)造了一個學生);public class Example3 public static void main(String args) Pupil3 pupil = new Pupil3();
13、18n除了調(diào)用父類構(gòu)造方法外,除了調(diào)用父類構(gòu)造方法外,super還可在子類中指代父類對還可在子類中指代父類對象,用于:象,用于:l訪問被子類隱藏的父類字段,訪問被子類隱藏的父類字段,l調(diào)用被子類覆蓋的父類方法。調(diào)用被子類覆蓋的父類方法。n使用形式:使用形式: super.父類字段名父類字段名 super.父類方法名父類方法名(可選實參表可選實參表)19n編寫人類編寫人類Humanl有私有的姓名、性別和年齡字段有私有的姓名、性別和年齡字段l定義獲取各個私有字段的受保護方法定義獲取各個私有字段的受保護方法l定義公共的構(gòu)造方法和思考方法定義公共的構(gòu)造方法和思考方法n編寫繼承人類的學生類編寫繼承人類的
14、學生類Pupill有私有的學號字段有私有的學號字段l獲取該字段的受保護方法獲取該字段的受保護方法l公共的構(gòu)造方法公共的構(gòu)造方法l學習方法學習方法n編寫繼承學生類的大學生類編寫繼承學生類的大學生類Studentl有公共的構(gòu)造方法、自學方法和輸出數(shù)據(jù)方法有公共的構(gòu)造方法、自學方法和輸出數(shù)據(jù)方法20n最后設(shè)計一個入口主類,構(gòu)造若干個大學生,把他們的數(shù)據(jù)最后設(shè)計一個入口主類,構(gòu)造若干個大學生,把他們的數(shù)據(jù)和行為列舉出來。和行為列舉出來。21class Human1 /人類人類private String name; private char sex; private int age; public H
15、uman(String name, char sex, int age) = name; this.sex = sex; this.age = age;public void think() /思考方法思考方法 System.out.println(name + 在思考在思考.); 22class Pupil extends Human /繼承人類的學生類繼承人類的學生類 private String stuNo; /學號學號public Pupil(String stuNo, String name, char sex, int age) super(name, sex,
16、 age); this.stuNo = stuNo;public void learn() /學習方法學習方法 System.out.println(getName() + ”在學習在學習”); 23class Student extends Pupilpublic Student()super(); public void study() System.out.println( + “在自學在自學”); public String toString() return String.format(“所構(gòu)造大學生信息:所構(gòu)造大學生信息: %s號號%s, %c, %d 歲歲”, getStuNo(
17、), getName(), ); 24n子類由父類派生,可把子類對象賦給父類聲明的變量。如:子類由父類派生,可把子類對象賦給父類聲明的變量。如:Human human = new Pupil();n或者:或者:Human human; Pupil pupil = new Pupil();human = pupil;25n這種由父類變量引用的子類對象就是這種由父類變量引用的子類對象就是上轉(zhuǎn)型對象上轉(zhuǎn)型對象。n上轉(zhuǎn)型對象具有如下特征:上轉(zhuǎn)型對象具有如下特征:(1)上轉(zhuǎn)型對象不能操作子類新增的成員字段和成員方法。)上轉(zhuǎn)型對象不能操作子類新增的成員字段和成員方法。(2)上轉(zhuǎn)型對象能使用父類被繼承或重寫
18、的成員方法、被繼)上轉(zhuǎn)型對象能使用父類被繼承或重寫的成員方法、被繼承或隱藏的成員變量。承或隱藏的成員變量。(3)如果子類重寫了父類的方法,則上轉(zhuǎn)型對象調(diào)用該方法)如果子類重寫了父類的方法,則上轉(zhuǎn)型對象調(diào)用該方法時一定是重寫后的方法(多態(tài)性)。時一定是重寫后的方法(多態(tài)性)。(4)如果子類重新定義了父類的同名字段,即隱藏了父類的)如果子類重新定義了父類的同名字段,即隱藏了父類的字段,則上轉(zhuǎn)型對象訪問該字段時必定是父類本身的字段。字段,則上轉(zhuǎn)型對象訪問該字段時必定是父類本身的字段。26class Human4 /人類人類 private String name; /姓名姓名public stati
19、c final String typeName = 人類人類; /類名類名public Human4(String name) /構(gòu)造方法構(gòu)造方法 = name;protected String getName() /獲取姓名方法獲取姓名方法return name;public void think() /思考方法思考方法System.out.println(name + 在思考在思考.);public String like() /愛好方法愛好方法return 愛好因人而異愛好因人而異; 27class Pupil4 extends Human4 /學生類學生類 priva
20、te String stuNo; /新增學號新增學號public static final String typeName = 學生類學生類; /隱藏繼承的字段隱藏繼承的字段public Pupil4(String stuNo, String name) /構(gòu)造方法構(gòu)造方法super(name);this.stuNo = stuNo;public String like() /重寫愛好方法重寫愛好方法return stuNo+ 號號+ getName() + 愛好文娛體育運動愛好文娛體育運動; public void learn() /新增學習方法新增學習方法System.out.printl
21、n(stuNo+ 號號+ getName() + 在學習在學習.);28public class Example4 public static void main(String args) System.out.println( = 學生的上轉(zhuǎn)型對象學生的上轉(zhuǎn)型對象 =);Human4 human = new Pupil4(001, 李明李明);System.out.println(該對象屬于該對象屬于 + human.typeName);System.out.println(human.like();human.think();/human.learn(); /出錯,只能出錯,只能(Pupi
22、l4)human).learn(); 上轉(zhuǎn)型對象還原為學生對象上轉(zhuǎn)型對象還原為學生對象 Pupil4 pupil = (Pupil4)human;System.out.println(該對象屬于該對象屬于 + pupil.typeName);System.out.println(pupil.like();pupil.think();pupil.learn();29n類的繼承與派生是一對互逆關(guān)系。類的繼承與派生是一對互逆關(guān)系。n父類:是所有子類的公共屬性和公共方法的集合父類:是所有子類的公共屬性和公共方法的集合n子類:繼承父類所有的非私有屬性和方法子類:繼承父類所有的非私有屬性和方法n子類是父類
23、的特例,一個父類可以有多個子類子類是父類的特例,一個父類可以有多個子類lJava:單繼承關(guān)系,一個子類只有一個父類:單繼承關(guān)系,一個子類只有一個父類lC+:多繼承關(guān)系,一個子類可有多個父類:多繼承關(guān)系,一個子類可有多個父類n具有繼承關(guān)系的程序字生成子類對象時先生成父類對象具有繼承關(guān)系的程序字生成子類對象時先生成父類對象n父類中用父類中用private修飾的實例變量在子類中不能直接訪問,修飾的實例變量在子類中不能直接訪問,但是可以調(diào)用所繼承的父類中的非私有方法去訪問。但是可以調(diào)用所繼承的父類中的非私有方法去訪問。3031nsuper:表示當前對象的直接父類對象的引用:表示當前對象的直接父類對象的
24、引用l可調(diào)用父類對象的屬性可調(diào)用父類對象的屬性l可調(diào)用父類對象的方法可調(diào)用父類對象的方法l可調(diào)用構(gòu)造函數(shù)可調(diào)用構(gòu)造函數(shù)* 用用super調(diào)用構(gòu)造函數(shù)時,要放于函數(shù)體第一個語句的位置調(diào)用構(gòu)造函數(shù)時,要放于函數(shù)體第一個語句的位置32nprotected主要作用是聲明能被所有派生子類繼承的成員。主要作用是聲明能被所有派生子類繼承的成員。n修飾符不同,可訪問的范圍不同。修飾符不同,可訪問的范圍不同。33訪問地點訪問地點同一個類中同一個類中同一個包中同一個包中不同包中的子類不同包中的子類不同包中的非子類不同包中的非子類public缺省privateprotectedn把子類對象賦給父類聲明的變量,就變成
25、了上轉(zhuǎn)型對象。把子類對象賦給父類聲明的變量,就變成了上轉(zhuǎn)型對象。n父類對象沒有下轉(zhuǎn)型對象。父類對象沒有下轉(zhuǎn)型對象。n父類對象不能直接賦值給子類變量,子類變量不能直接引用父類對象不能直接賦值給子類變量,子類變量不能直接引用父類對象。父類對象。n如果一定要引用,則必須使用強制類型轉(zhuǎn)換,語法:如果一定要引用,則必須使用強制類型轉(zhuǎn)換,語法:(類型名類型名) 變量變量n比如:比如:Pupil4 pupil = (Pupil4)human;n注意:并不是所有強制類型轉(zhuǎn)換都能成功,例如:把馬類的注意:并不是所有強制類型轉(zhuǎn)換都能成功,例如:把馬類的動物強制轉(zhuǎn)換為鳥,就無法轉(zhuǎn)換。無法轉(zhuǎn)換時會引發(fā)異常。動物強制轉(zhuǎn)
26、換為鳥,就無法轉(zhuǎn)換。無法轉(zhuǎn)換時會引發(fā)異常。34n如果鳥類、馬類和魚類都繼承動物類,則它們是同一層次的,如果鳥類、馬類和魚類都繼承動物類,則它們是同一層次的,是兄弟(姐妹)類。是兄弟(姐妹)類。n顯然,鳥不是馬,鳥也不是魚,因此,不能把鳥對象賦給馬顯然,鳥不是馬,鳥也不是魚,因此,不能把鳥對象賦給馬類或魚類聲明的變量。類或魚類聲明的變量。n同一層次的兄弟類變量之間不能相互賦值,即兄弟類對象間同一層次的兄弟類變量之間不能相互賦值,即兄弟類對象間不能相互替換。不能相互替換。35n類的類的多態(tài)性多態(tài)性:l一是類本身,一是類本身,l二是作為父類專用于派生,二是作為父類專用于派生,l三是通過實現(xiàn)接口而充當
27、接口的實例類型。三是通過實現(xiàn)接口而充當接口的實例類型。n多態(tài)主要反映在多態(tài)主要反映在方法重寫方法重寫(覆蓋覆蓋)和和方法重載方法重載這兩個方面。這兩個方面。3637n方法重寫方法重寫:子類中的方法與父類中繼承的方法有完全相同的:子類中的方法與父類中繼承的方法有完全相同的返回值類型、方法名、參數(shù)個數(shù)以及參數(shù)類型。這樣,父類返回值類型、方法名、參數(shù)個數(shù)以及參數(shù)類型。這樣,父類中定義的同名方法在子類中被覆蓋。中定義的同名方法在子類中被覆蓋。n重寫體現(xiàn)了重寫體現(xiàn)了Java優(yōu)越性,重寫是建立在繼承關(guān)系上,它使優(yōu)越性,重寫是建立在繼承關(guān)系上,它使語言結(jié)構(gòu)更加豐富。子類可以定義新的特征,修改父類的一語言結(jié)構(gòu)
28、更加豐富。子類可以定義新的特征,修改父類的一些方法進行擴展,增大功能。些方法進行擴展,增大功能。n在在Java中的繼承中,子類既可以中的繼承中,子類既可以隱藏和訪問隱藏和訪問父類的方法,父類的方法,也可以也可以覆蓋覆蓋繼承父類的方法。在繼承父類的方法。在Java中覆蓋繼承父類的方中覆蓋繼承父類的方法就是通過方法的重寫來實現(xiàn)的。法就是通過方法的重寫來實現(xiàn)的。class Mammal /哺乳動物類哺乳動物類public void Shout() /呼叫方法呼叫方法System.out.println(不同類的動物叫聲不同不同類的動物叫聲不同);class Cat extends Mammal /繼
29、承哺乳動物類的貓類繼承哺乳動物類的貓類public void Shout() /重寫呼叫方法重寫呼叫方法System.out.println(貓的叫聲:喵貓的叫聲:喵.喵喵.);class Dog extends Mammal /繼承哺乳動物類的狗類繼承哺乳動物類的狗類public void Shout() /重寫呼叫方法重寫呼叫方法System.out.println(狗的叫聲:汪狗的叫聲:汪.汪汪.);class Tiger extends Mammal /繼承哺乳動物類的虎類繼承哺乳動物類的虎類public void Shout() /重寫呼叫方法重寫呼叫方法System.out.pri
30、ntln(虎的叫聲:吼虎的叫聲:吼.吼吼.);public class Example5 public static void main(String args)Mammal animal;animal = new Cat();animal.Shout();animal = new Dog();animal.Shout();animal = new Tiger();animal.Shout(); 39n方法重載方法重載:在一個類中定義多個同名但簽名不同的方法。:在一個類中定義多個同名但簽名不同的方法。n例如兩數(shù)相加方法例如兩數(shù)相加方法add(a, b),參數(shù)類型組合有,參數(shù)類型組合有4種(多種
31、(多態(tài)):整整、整實、實整、實實,因此可定義態(tài)):整整、整實、實整、實實,因此可定義4個同名但參個同名但參數(shù)類型不同的方法(詳見第數(shù)類型不同的方法(詳見第3章章3.5節(jié)節(jié)“方法簽名與方法重方法簽名與方法重載載”的例的例3-2)。)。40區(qū)別點區(qū)別點重載重載重寫(覆蓋)重寫(覆蓋)英文OverloadingOveriding定義方法名稱相同,參數(shù)的類型或個數(shù)不同方法名稱、參數(shù)類型、返回值類型全部相同對權(quán)限沒有要求被重寫的方法不能擁有更嚴格的權(quán)限范圍發(fā)生在一個類中發(fā)生在繼承類中41n但子類變量不能引用父類對象,兄弟類對象也不能相互替換。但子類變量不能引用父類對象,兄弟類對象也不能相互替換。n關(guān)于多態(tài)性,主要表現(xiàn)在方法重寫和方法重載上。前者涉及關(guān)于多態(tài)性,主要表現(xiàn)在方法重寫和方法重載上。前者涉及到
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新興文化消費市場發(fā)展趨勢研究報告
- 三農(nóng)村合作社碳排放減少方案
- 腫瘤內(nèi)腸癌復習測試有答案
- 家服務(wù)員中級練習卷附答案
- 跨部門協(xié)作與溝通策略方案
- 康復護理師復習試題
- 電子信息行業(yè)新型顯示技術(shù)與創(chuàng)新應(yīng)用方案
- 營銷活動策劃與執(zhí)行手冊
- 環(huán)境治理技術(shù)及應(yīng)用試題
- 三農(nóng)村電商三農(nóng)村物流配送優(yōu)化方案
- 貝雷橋吊裝專項方案(危大工程吊裝方案)
- 昌江縣燕窩嶺水泥用石灰?guī)r礦礦產(chǎn)資源開發(fā)利用與保護方案
- 2024年《認證基礎(chǔ)》真題及答案
- ZHF形勢與政策(2024年秋)-考試題庫
- 淤地壩應(yīng)急處置
- 鸚鵡介紹課件教學課件
- 汽車檢測技術(shù)課件 任務(wù)一 認識汽車檢測站
- 貴州省2025年初中學業(yè)水平考試英語 模擬試題卷(一)(含答案不含聽力原文及聽力音頻)
- 電力系統(tǒng)運行維護預案
- GB/T 44561-2024石油天然氣工業(yè)常規(guī)陸上接收站液化天然氣裝卸臂的設(shè)計與測試
- 2024年國家公務(wù)員考試《行測》真題卷(副省級)答案及解析
評論
0/150
提交評論