




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第5章 類的繼承本章知識點繼承的概念和作用子類的聲明類成員修飾符與繼承的關系理解父類和子類的關系,在子類中使用父類成員(方法)繼承機制下,對象創(chuàng)建的過程(構造方法的使用,super調用)子類對父類方法的重寫(super調用)代碼復用的手段 “is-a” 關系: 類之間是繼承的關系“has-a”關系: 類之間是組合的關系繼承:從已有的類中派生出新的類。新的類能吸收已有類的數(shù)據(jù)屬性和行為并能擴展新的能力舉例:商品5.1.1 繼承的概念父類是子類的一般化,子類是父類的特例化(具體化)。父類也稱為超類或基類。5.1.1 繼承的概念父 類子 類學生研究生、大學生、小學生形狀三角形、圓、矩形雇員教師、醫(yī)生
2、、職員交通工具轎車、卡車、公交車水果蘋果、梨、桃、桔超類/基類父類子類parents/super/basechild/derived繼承分類單繼承:一個子類最多只能有一個父類。多繼承:一個子類可有兩個以上的父類。Java類只支持單繼承,而接口支持多繼承。Java多繼承的功能則是通過接口方式來間接實現(xiàn)的。5.1.1 繼承的概念子類定義的一般格式 類修飾符 class 子類名 extends 父類名 成員變量定義; 成員方法定義;在子類的定義中,用關鍵字extends來明確指出它所繼承的父類。5.1.2 繼承的實現(xiàn)【例5-1】通過繼承Person類派生DeliveryMan類。5.1.2 繼承的實
3、現(xiàn)快遞公司的不同職工職工Person快遞員 DeliveryMan數(shù)據(jù)成員配送區(qū)域deliveryArea獲取配送區(qū)域方法getDeliveryArea()獲取快遞員信息方法getInfo()判斷某區(qū)域是否在配送范圍內方法isArrived()要區(qū)分“存在”與“可見”之間的關系。private的成員與其他成員一樣都被繼承到子類中(是存在的),只是它們不能被子類直接使用而已(不可見)。5.1.2 繼承的實現(xiàn)成員訪問控制修飾符在繼承中的性質public、private、package、protected父類的public成員可以在父類中使用,也可以在子類使用。程序可以在任何地方訪問public父類
4、成員。父類的private成員僅在父類中使用,在子類中不能被訪問。父類的protected成員可在子類被訪問,無論子類與父類是否存儲在同一個包下。父類的package成員可在同一包的子類中被訪問。5.1.3 類成員的訪問控制子類從父類繼承成員時,父類的所有public、protected、package成員,在子類中都保持它們原有的訪問修飾符。例如,父類的public成員成為子類的public成員。父類的protected成員也會成為子類的protected成員。子類只能通過父類所提供的非private方法來訪問父類的private成員。類A成員的訪問控制符類A對類A成員的訪問權限第三方類對類
5、A成員的訪問權限子類B對類A成員的訪問權限與A同包與A不同包與A同包與A不同包publicprotected默認(package)private5.1.3 類成員的訪問控制【例5-2】分析同包下無繼承關系的類之間成員的訪問控制權限。5.1.3 類成員的訪問控制package chap5.example.access;public class C public int a=1;protected int b=2;int c=3;private int d=4;public int getD()return d;package chap5.example.access;public class A
6、ccessDemo public static void main(String args) C coo = new C();System.out.println(coo.a); System.out.println(coo.b);System.out.println(coo.c);/System.out.println(coo.d); System.out.println(coo.getD();【例5-3】分析不同包下子類對父類成員的訪問控制權限。5.1.3 類成員的訪問控制package chap5.example.access.sub;public class C public int
7、a;protected int b;int c;private int d;public int getD()return d;package chap5.example.access;import chap5.example.access.sub.C;public class AccessDemo extends C public void getInfo()System.out.println(a); System.out.println(b);System.out.println(c);System.out.println(d);Object類:Java中所有類的父類,定義和實現(xiàn)了Jav
8、a系統(tǒng)下所有類的共同行為,所有的類都是由這個類繼承、擴充而來的。認識Object類中的方法5.2 重寫父類方法【例5-4】定義Animal類的子類Bird,并重寫它的move()方法。5.2.1 重寫及其意義public class Animal public void move()System.out.println(我可以move.);public class Bird extends Animalpublic void move()System.out.println(我可以在天空飛翔.);public staticvoid main(String args)Bird bird = ne
9、wBird();bird.move(); /輸出我可以在天空飛翔.方法的重寫遵循“兩同兩小一大”的規(guī)則“兩同”:方法名稱相同、形參列表相同“兩小”子類方法返回值類型父類方法返回值類型子類方法拋出的異常父類方法拋出的異?!耙淮蟆保鹤宇惙椒ǖ脑L問權限父類方法的訪問權限重寫方法時不能改變方法的static或非static性質。5.2.1 重寫及其意義Object類中定義了9個方法clone()finalize()toString()equals()hashCode()notify()notifyAll()wait()getClass()5.2.2 Object類與重寫toString()方法【例5-
10、5】在DeliveryMan類中重寫toString方法。5.2.2 Object類與重寫toString()方法public class DeliveryMan extends Person private String deliveryArea;public String toString()String str = getId()+,+getName()+n配送范圍:;int i;for(i=0; ideliveryArea.length-1; i+)/除最后一個外,都有一個逗號str+=deliveryAreai+,;return str+deliveryAreai;【例5-5】在De
11、liveryMan類中重寫toString方法。5.2.2 Object類與重寫toString()方法public class Test public static void main(String args) DeliveryMan dm = new DeliveryMan();dm.setId(007);dm.setName(Bang);dm.setDeliveryArea(new String南鑼鼓巷,煙袋斜街,雨兒胡同,帽兒胡同,黑芝麻胡同);System.out.println(快遞員信息:+dm);【例5-6】利用super調用父類的同名方法。5.2.3 調用父類被重寫的方法pu
12、blic class Animal public void move()System.out.println(我可以move.);public class Bird extends Animalpublic void move() super.move();/調用父類的move()方法System.out.println(我可以在天空飛翔.);public static void main(String args)Bird bird = new Bird();bird.move(); /輸出我可以move我可以在天空飛翔.【例5-7】在Student類中重寫Object的clone()方法,實
13、現(xiàn)Student對象的深復制。5.2.4 Object類的clone()方法與對象的復制Object類中的clone()方法的訪問修飾符是protected,所以不能用下面的方式復制對象。5.2.4 Object類的clone()方法與對象的復制public class Student private String name;private int age;public Student() public Student(String name, int age) = name;this.age = age;public class Test public static vo
14、id main(String args)Student stu1 = new Student(Lucy,15);Student stu2 = null;try /此句報錯stu2 = (Student)stu1.clone(); catch (CloneNotSupportedException e) e.printStackTrace();Test類相對于Student類來講,身份是“第三方類”(既不是Student類本身,也不是Student的子類)clone()方法來自于Object,與Test不同包,所以Test沒有權利訪問Student從Object繼承來的protected修飾的方
15、法。public class Student implements Cloneable / implements Cloneable表示實現(xiàn)Cloneable接口private String name;private int age;public Object clone() /重寫Object類的clone()方法Student stu = null;try stu = (Student)super.clone(); /調用Object類的clone()功能完成復制 catch (CloneNotSupportedException e) e.printStackTrace();return
16、 stu;5.2.4 Object類的clone()方法與對象的復制public class Test public static void main(String args)Student stu1 = new Student(Lucy,15);Student stu2 = (Student)stu1.clone();System.out.println(stu1);System.out.println(stu2);5.2.4 Object類的clone()方法與對象的復制5.2.4 Object類的clone()方法與深、淺復制淺復制001zhang堆內存teacher1001zhang堆
17、內存teacher1001zhang5.2.4 Object類的clone()方法與深、淺復制深復制001zhang堆內存teacher1001zhang堆內存teacher1001zhangteacher1【例】向Student中組合一個Teacher類的引用成員。實現(xiàn)深復制時,如果對象中包含引用成員,則該引用成員所屬類也需要重寫clone()方法。在復制對象時,再單獨復制引用成員所指對象。5.2.4 Object類的clone()方法與深、淺復制請思考下面代碼的運行結果是什么?public class Test public static void main(String args)Tea
18、cher teacher = new Teacher(Grace);Student stu1 = new Student(Lucy,15, teacher);Student stu2 = (Student)stu1.clone();stu1.getTeacher().setName(Kenzo);System.out.println(stu1:+stu1);System.out.println(stu2:+stu2);淺復制代碼改進如下:public class Teacher implements Cloneablepublic Object clone()/重寫clone方法Teacher
19、 tea = null;try tea = (Teacher)super.clone(); catch (CloneNotSupportedException e) e.printStackTrace();return tea;深復制public class Student implements Cloneablepublic Object clone()Student stu = null;try stu = (Student)super.clone(); catch (CloneNotSupportedException e) e.printStackTrace();/復制引用成員所指對象
20、this.teacher = (Teacher)stu.getTeacher().clone(); return stu;深復制繼承下的構造方法的調用次序子類構造方法在執(zhí)行自己的任務之前,將顯式地(通過super引用)或隱式地(調用父類默認的無參數(shù)構造方法)調用其直接父類的構造方法。類似地,如果父類派生于另一個類,則要求父類的構造方法調用上一級類的構造方法,依此類推。調用請求中,最先調用的一定是Object類的構造方法。創(chuàng)建對象的過程:先父后子。5.3 子類對象的構造【例5-8】已知圓Circle橢圓Ellipse形狀Shape的繼承關系,查看Circle對象構建的過程。5.3.1 子類對象的
21、構造過程public class Shape private String name;public Shape() System.out.println(Shape().);public class Ellipse extends Shapeprivate double a; /短軸private double b; /長軸public Ellipse() System.out.println(Ellipse().);public class Circle extends Ellipsepublic Circle() System.out.println(Cicle().);為了避免錯誤,父類
22、中至少定義一個無參的構造方法。子類不會繼承父類的構造方法,但是子類可以調用父類的構造方法,如同一個類的構造方法可以用this()調用自己的重載構造方法一樣。子類調用父類構造方法使用super()完成。5.3.2 super與this調用構造方法構造方法調用的過程(1)子類構造方法的第一行使用super()顯式調用父類的構造方法,編譯系統(tǒng)根據(jù)super的實參列表調用對應的父類構造方法。(2)子類構造方法的第一行使用this()顯式調用本類重載的構造方法,編譯系統(tǒng)根據(jù)this的實參列表調用對應的本類構造方法。執(zhí)行本類另一個構造方法時會顯式或隱式地調用父類的構造方法。(3)如果子類構造方法中既沒有super調用,也沒有this調用,系
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 學生領導力發(fā)展的計劃
- 二年級上冊數(shù)學 第四單元森林里的故事 《 除法的初步認識》 教案青島版(五四學制)
- 一年級下冊數(shù)學教案-8.1.認識厘米 青島版
- 三年級數(shù)學上冊單元教案-第1單元 混合運算-北師大版
- 管家工作表現(xiàn)好的評語
- 第四單元信息窗一《三角形的認識》(教案)-四年級上冊數(shù)學青島版(五四學制)
- 2025年拉薩貨運從業(yè)考試試題答案大全
- 2025年甘孜駕??荚嚳拓涍\從業(yè)資格證考試題庫
- 2025年呼和浩特貨車資格證答案
- 2025年陜西運輸從業(yè)資格證考試試題庫
- 儀表說明書umc1300用戶手冊
- 交通運輸安全管理整套教學課件
- 城軌道交通運營管理專業(yè)設置的必要性和可行性分析報告
- 招商團隊架構
- 第二章基因工程的載體和工具酶
- 高職單招英語單詞
- 【圖文】科技藝術節(jié) 紙橋受力分析圖
- 睿智cpld開發(fā)板用戶手冊10版本
- 李雁鳴循環(huán)理論
- 火花塞的拆裝檢查ppt課件
- 課題研究思路流程圖
評論
0/150
提交評論