《信息系統(tǒng)開發(fā)》系統(tǒng)開發(fā)方法與工具演示文檔
《《信息系統(tǒng)開發(fā)》系統(tǒng)開發(fā)方法與工具演示文檔》由會員分享,可在線閱讀,更多相關(guān)《《信息系統(tǒng)開發(fā)》系統(tǒng)開發(fā)方法與工具演示文檔(77頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1/39,繼承,2,目錄,1 類的繼承 2 終結(jié)類與終結(jié)方法 3 抽象類 4 類的組合,,Java類的定義 [public] [abstract|final] class 類名[extends 父類名] [implements 接口名] { [成員變量(域)定義] [成員函數(shù)(方法)定義] },3/39,4,1 類的繼承,類的繼承 一種由已有的類創(chuàng)建新類的機制,是面向?qū)ο蟪绦蛟O(shè)計的基石之一 通過繼承,可以根據(jù)已有類來定義新類,新類擁有已有類的所有功能 Java只支持類的單繼承,每個子類只能有一個直接父類 父類是所有子類的公共屬性及方法的集合,子類則是父類的特殊化 繼承機制可以提高程序的抽象程度,提高代碼的可重用性,5,基類(base class) 也稱超類(superclass) 是被直接或間接繼承的類 派生類(derived-class) 也稱子類 (subclass) 繼承其他類而得到的類 繼承所有祖先的狀態(tài)和行為 派生類可以增加變量和方法 派生類也可以覆蓋(override)繼承的方法,1 類的繼承,1.1 繼承的概念——基類和派生類,6,子類對象與父類對象存在“IS A”(或“is a kind of”)的關(guān)系,1 類的繼承,1.1 繼承的概念——is_a關(guān)系,7,,動物類層次舉例,,,,,,一般,具體,動物,蛇,蜥蜴,鯨,爬行動物,哺乳動物,狗,巨蜥,壁虎,,,,,,,,,,,,壁虎,是一種,蜥蜴,,,爬行,動物是,動物的,一種,,,1 類的繼承,1.1 繼承的概念——圖,8,,舉例,1 類的繼承,1.1 繼承的概念——又一個例子,9,10,派生類產(chǎn)生的對象 從外部來看,它應(yīng)該包括 與基類相同的接口 可以具有更多的方法和數(shù)據(jù)成員 其內(nèi)包含著一個基類類型的子對象,1 類的繼承,1.1 繼承的概念——派生類對象,11,1.2 繼承的語法,繼承的語法 class childClass extends parentClass { //類體 },類的繼承,1 類的繼承,12,,在一個公司中,有普通員工(Employees)及管理人員(Magagers)兩類人員 職員對象(Employees)可能有的屬性信息包括 員工號(employeeNumber) 姓名(name) 地址(address) 電話號碼(phoneNumber) 管理人員(Managers)除具有普通員工的屬性外,還可能具有下面的屬性 職責(zé)(responsibilities) 所管理的職員(listOfEmployees),1 類的繼承,1.2 繼承的語法(續(xù))——例,13,Employee與Manager的類圖,1 類的繼承,1.2 繼承的語法(續(xù))——例,14,//父類Employee class Employee { int employeeNumbe ; String name, address, phoneNumber ; } //子類Manager class Manager extends Employee { //子類增加的數(shù)據(jù)成員 String responsibilities, listOfEmployees; },1 類的繼承,1.2 繼承的語法(續(xù))——例,15,設(shè)有三個類:Person, Employee, Manager。其類層次如圖:,1.2 繼承的語法(續(xù))——例,16,1.2 繼承的語法(續(xù))——例,17,1.2 繼承的語法(續(xù))——例,18,1.2 繼承的語法(續(xù))——例,19,1 類的繼承,1.2 繼承的語法(續(xù)),20,,21,22,1 類的繼承,通過繼承,可以根據(jù)已有類來定義新類,新類擁有已有類的所有功能 父類是所有子類的公共屬性及方法的集合,子類則是父類的特殊化 繼承機制可以提高程序的抽象程度,提高代碼的可重用性,23,子類不能直接訪問父類中的私有屬性及方法 可使用公有(及保護)方法進行訪問,1 類的繼承,1.2 繼承的語法(續(xù))——例,24,public class B { public int a = 10; private int b = 20; protected int c = 30; public int getB() { return b; } } public class A extends B { public int d; public void tryVariables() { System.out.println(a); //允許 System.out.println(b); //不允許 System.out.println(getB()); //允許 System.out.println(c); //允許 } },1 類的繼承,1.2 繼承的語法(續(xù)),25,1.3 隱藏和覆蓋,擴展類 繼承已有的屬性和方法 改寫已有的屬性和方法 改寫已有的屬性:隱藏 改寫已有的方法:覆蓋,1 類的繼承,26,,屬性的隱藏 子類中聲明了與父類中相同的成員變量名,則從父類繼承的變量將被隱藏 子類擁有了兩個相同名字的變量,一個繼承自父類,另一個由自己聲明 當(dāng)子類執(zhí)行繼承自父類的操作時,處理的是繼承自父類的變量,而當(dāng)子類執(zhí)行它自己聲明的方法時,所操作的就是它自己聲明的變量,class Parent { int aNumber; },class Child extends Parent { float aNumber; },1 類的繼承,1.3 隱藏和覆蓋(續(xù))——屬性的隱藏,27,如何訪問被隱藏的父類屬性 調(diào)用從父類繼承的方法,則操作的是從父類繼承的屬性 調(diào)用被隱藏的屬性 super.屬性,1 類的繼承,1.3 隱藏和覆蓋(續(xù))——訪問被隱藏的父類屬性,28,class A1 { int x = 2; public void setx(int i) { x = i; } void printa() {System.out.println(x);} } class B1 extends A1 { int x=100; void printb() { super.x = super.x +10 ; System.out.println("super.x=" + super.x + " x= " + x); } },運行結(jié)果: 4 super.x= 12 x= 100 12 super.x= 16 x= 100 16 4,public class Exam4_4Test { public static void main(String[] args) { A1 a1 = new A1(); a1.setx(4); a1.printa(); B1 b1 = new B1(); b1.printb(); b1.printa(); b1.setx(6); // 將繼承x值設(shè)置為6 b1.printb(); b1.printa(); a1.printa(); } },1 類的繼承,1.3 隱藏和覆蓋(續(xù))——例屬性的隱藏舉例,29,30,31,32,33,34,,子類不能繼承父類中的靜態(tài)屬性,但可以對父類中的靜態(tài)屬性進行操作。如在上面的例子中,將“int x = 2;”改為“static int x = 2;”,再編譯及運行程序,會得到下面的結(jié)果 4 super.x= 14 x= 100 14 super.x= 16 x= 100 16 16 在上面的結(jié)果中,第一行及最后一行都是語句“a1.printa();”輸出的結(jié)果,顯然類B中的printb()方法修改的是類A中的靜態(tài)屬性x,1 類的繼承,1.3 隱藏和覆蓋(續(xù))——例 操作父類靜態(tài)屬性舉例,35,36,1.3 隱藏和覆蓋,擴展類 繼承已有的屬性和方法 改寫已有的屬性和方法 改寫已有的屬性:隱藏 改寫已有的方法:覆蓋,1 類的繼承,37,,方法覆蓋 覆蓋方法的返回類型,方法名稱,參數(shù)的個數(shù)及類型必須和被覆蓋的方法一摸一樣 覆蓋方法的訪問權(quán)限可以比被覆蓋的寬松,但是不能更為嚴(yán)格,1 類的繼承,1.3 隱藏和覆蓋(續(xù))——方法覆蓋,38,方法覆蓋的應(yīng)用場合 子類中實現(xiàn)與父類相同的功能,但采用不同的算法或公式 在名字相同的方法中,要做比父類更多的事情 在子類中需要取消從父類繼承的方法,1 類的繼承,1.3 隱藏和覆蓋(續(xù))——方法覆蓋的應(yīng)用場合,39,必須覆蓋的方法 派生類必須覆蓋基類中的抽象的方法,否則派生類自身也成為抽象類. 不能覆蓋的方法 基類中聲明為final的終結(jié)方法 基類中聲明為static 的靜態(tài)方法 調(diào)用被覆蓋的方法 super.overriddenMethodName();,1 類的繼承,1.3 隱藏和覆蓋(續(xù))——方法覆蓋的注意事項,40,1.4 有繼承時的構(gòu)造方法,有繼承時的構(gòu)造方法遵循以下的原則 子類不能從父類繼承構(gòu)造方法 好的程序設(shè)計方法是在子類的構(gòu)造方法中調(diào)用某一個父類構(gòu)造方法,調(diào)用語句必須出現(xiàn)在子類構(gòu)造方法的第一行,可使用super關(guān)鍵字 如子類構(gòu)造方法的聲明中沒有明確調(diào)用父類構(gòu)造方法,則系統(tǒng)在執(zhí)行子類的構(gòu)造方法時會自動調(diào)用父類的默認(rèn)構(gòu)造方法(即無參的構(gòu)造方法),1 類的繼承,41,public class Person { protected String name, phoneNumber, address; public Person() { this("", "", ""); } public Person(String aName, String aPhoneNumber, String anAddress) { name = aName; phoneNumber = aPhoneNumber; address = anAddress; } },1 類的繼承,1.4 有繼承時的構(gòu)造方法(續(xù))——例,42,public class Employee extends Person { protected int employeeNumber; protected String workPhoneNumber; public Employee() { //此處隱含調(diào)用構(gòu)造方法 Person() this(0, ""); } public Employee(int aNumber, String aPhoneNumber) { //此處隱含調(diào)用構(gòu)造方法 Person() employeeNumber = aNumber; workPhoneNumber = aPhoneNumber; } },1 類的繼承,1.4 有繼承時的構(gòu)造方法(續(xù))——例,43,public class Professor extends Employee { protected String research; public Professor() { super(); research = ""; } public Professor(int aNumber, String aPhoneNumber, String aResearch) { super(aNumber, aPhoneNumber); research = aResearch; } },1 類的繼承,1.4 有繼承時的構(gòu)造方法(續(xù))——例,44,目錄,1 類的繼承 2 終結(jié)類與終結(jié)方法 3 抽象類 4 類的組合,,Java類的定義 [public] [abstract|final] class 類名[extends 父類名] [implements 接口名] { [成員變量(域)定義] [成員函數(shù)(方法)定義] },45/39,46,2 終結(jié)類與終結(jié)方法,終結(jié)類與終結(jié)方法 被final修飾符修飾的類和方法 終結(jié)類不能被繼承 終結(jié)方法不能被當(dāng)前類的子類重寫,47,終結(jié)類的特點 不能有派生類 終結(jié)類存在的理由 安全: 黑客用來攪亂系統(tǒng)的一個手法是建立一個類的派生類,然后用他們的類代替原來的類 設(shè)計: 你認(rèn)為你的類是最好的或從概念上你的類不應(yīng)該有任何派生類,2 終結(jié)類與終結(jié)方法,2.1 終結(jié)類,48,聲明ChessAlgorithm 類為final 類 final class ChessAlgorithm { . . . } 如果寫下如下程序: class BetterChessAlgorithm extends ChessAlgorithm { … } 編譯器將顯示一個錯誤 Chess.java:6: Can't subclass final classes: class ChessAlgorithm class BetterChessAlgorithm extends ChessAlgorithm { ^ 1 error,2 終結(jié)類與終結(jié)方法,2.1 終結(jié)類(續(xù))——一個例子,49,終結(jié)方法的特點 不能被派生類覆蓋 終結(jié)方法存在的理由 對于一些比較重要且不希望子類進行更改的方法,可以聲明為終結(jié)方法。可防止子類對父類關(guān)鍵方法的錯誤重寫,增加了代碼的安全性和正確性 提高運行效率。通常,當(dāng)java運行環(huán)境(如java解釋器)運行方法時,它將首先在當(dāng)前類中查找該方法,接下來在其超類中查找,并一直沿類層次向上查找,直到找到該方法為止,2 終結(jié)類與終結(jié)方法,2.2 終結(jié)方法,50,,final 方法舉例 class Parent { public Parent() { } //構(gòu)造方法 final int getPI() { return Math.PI; } //終結(jié)方法 } 說明 getPI()是用final修飾符聲明的終結(jié)方法,不能在子類中對該方法進行重載,因而如下聲明是錯的 Class Child extends Parent { public Child() { } //構(gòu)造方法 int getPI() { return 3.14; } //重寫父類中的終結(jié)方法,不允許 },2 終結(jié)類與終結(jié)方法,2.2 終結(jié)方法(續(xù))——例,51,目錄,1 類的繼承 2 終結(jié)類與終結(jié)方法 3 抽象類 4 類的組合,,Java類的定義 [public] [abstract|final] class 類名[extends 父類名] [implements 接口名] { [成員變量(域)定義] [成員函數(shù)(方法)定義] },52/39,53,3 抽象類,抽象類 代表一個抽象概念的類 沒有具體實例對象的類,不能使用new方法進行實例化 類前需加修飾符abstract 可包含常規(guī)類能夠包含的任何東西,例如構(gòu)造方法,非抽象方法 也可包含抽象方法,這種方法只有方法的聲明,而沒有方法的實現(xiàn),54,存在意義 抽象類是類層次中較高層次的概括,抽象類的作用是讓其他類來繼承它的抽象化的特征 抽象類中可以包括被它的所有子類共享的公共行為 抽象類可以包括被它的所有子類共享的公共屬性 在程序中不能用抽象類作為模板來創(chuàng)建對象; 在用戶生成實例時強迫用戶生成更具體的實例,保證代碼的安全性,3 抽象類(續(xù))——存在意義,55,,將所有圖形的公共屬性及方法抽象到抽象類Shape。再將2D及3D對象的特性分別抽取出來,形成兩個抽象類TwoDimensionalShape及ThreeDimensionalShape 2D圖形包括Circles、Triangles、Rectangles和Squares 3D圖形包括Cube、Sphere、或Tetrahedron 在UML中,抽象類的類名為斜體,以與具體類相區(qū)別,3 抽象類(續(xù))——幾何形狀的例子,56,57,前例中,如果在應(yīng)用系統(tǒng)中涉及到的人員只包括:Customers,Employees 及 Managers。則Person 類的子類對象覆蓋了應(yīng)用中的對象,可以將Person 類聲明為抽象類,3 抽象類(續(xù))——人員的例子,58,3.1 抽象類的聲明,抽象類聲明的語法形式為 abstract class Number { . . . } 如果寫: new Number(); 編譯器將顯示錯誤,3 抽象類,59,3.2 抽象方法,抽象方法 聲明的語法形式為 public abstract (...); 僅有方法頭,而沒有方法體和操作實現(xiàn) 具體實現(xiàn)由當(dāng)前類的不同子類在它們各自的類聲明中完成 抽象類可以包含抽象方法,3 抽象類,60,需注意的問題 一個抽象類的子類如果不是抽象類,則它必須為父類中的所有抽象方法書寫方法體,即重寫父類中的所有抽象方法 只有抽象類才能具有抽象方法,即如果一個類中含有抽象方法,則必須將這個類聲明為抽象類 除了抽象方法,抽象類中還可以包括非抽象方法,3 抽象類,3.2 抽象方法(續(xù))——需注意的問題,61,抽象方法的優(yōu)點 隱藏具體的細(xì)節(jié)信息,所有的子類使用的都是相同的方法頭,其中包含了調(diào)用該方法時需要了解的全部信息 強迫子類完成指定的行為,規(guī)定其子類需要用到的“標(biāo)準(zhǔn)”行為,3 抽象類,3.2 抽象方法(續(xù))——抽象方法的優(yōu)點,62,各種圖形都需要實現(xiàn)繪圖方法,可在它們的抽象父類中聲明一個draw抽象方法 abstract class GraphicObject { int x, y; void moveTo(int newX, int newY) { . . . } abstract void draw(); },3 抽象類,3.2 抽象方法(續(xù))——一個繪圖的例子,63,然后在每一個子類中重寫draw方法,例如: class Circle extends GraphicObject { void draw() { . . . } } class Rectangle extends GraphicObject { void draw() { . . . } },3 抽象類,3.2 抽象方法(續(xù))——一個繪圖的例子,64,目錄,1 類的繼承 2 終結(jié)類與終結(jié)方法 3 抽象類 4 類的組合,65,66,4.1 組合的語法,組合的語法很簡單,只要把已存在類的對象放到新類中即可 可以使用“has a”語句來描述這種關(guān)系 例如,考慮Kitchen類提供烹飪和冷藏食品的功能,很自然的說“my kitchen 'has a' cooker/refrigerator”。所以,可簡單的把對象myCooker和myRefrigerator放在類Kitchen中。格式如下 class Cooker{ // 類的語句 } class Refrigerator{ // 類的語句} class Kitchen{ Cooker myCooker; Refrigerator myRefrigerator; },4 類的組合,67,一條線段包含兩個端點 public class Point //點類 { private int x, y; //coordinate public Point(int x, int y) { this.x = x; this.y = y;} public int GetX() { return x; } public int GetY() { return y; } },4類的組合,4.1 組合的語法——例,68,,class Line //線段類 { private Point p1,p2; // 兩端點 Line(Point a, Point b) { p1 = new Point(a.GetX(),a.GetY()); p2 = new Point(b.GetX(),b.GetY()); } public double Length() { return Math.sqrt(Math.pow(p2.GetX()-p1.GetX(),2) + Math.pow(p2.GetY()-p1.GetY(),2)); } },4 類的組合,4.1 組合的語法——例,69,car(汽車)對象是一個很好的例子,由于汽車的裝配是故障分析時需要考慮的一項因素,所以有助于客戶程序員理解如何使用類,而且類創(chuàng)建者的編程復(fù)雜程度也會大幅度降低 class Engine { //發(fā)動機類 public void start() {} public void rev() {} public void stop() {} },4 類的組合,4.1 組合與繼承的比較(續(xù))——Car的例子,70,class Wheel { //車輪類 public void inflate(int psi) {} } class Window { //車窗類 public void rollup() {} public void rolldown() {} } class Door { //車門類 public Window window = new Window(); public void open() {} public void close() {} },4 類的組合,4.1 組合與繼承的比較(續(xù))——Car的例子,71,public class Car { public Engine engine = new Engine(); public Wheel[] wheel = new Wheel[4]; public Door left = new Door(),right = new Door(); public Car() { for(int i = 0; i < 4; i++) wheel[i] = new Wheel(); } public static void main(String[] args) { Car car = new Car(); car.left.window.rollup(); car.wheel[0].inflate(72); } },4 類的組合,4.1 組合與繼承的比較(續(xù))——Car的例子,72,許多時候都要求將組合與繼承兩種技術(shù)結(jié)合起來使用,創(chuàng)建一個更復(fù)雜的類,4 類的組合,4.1 組合與繼承的結(jié)合,73,組合與繼承舉例 class Plate { //聲明盤子 public Plate(int i) { System.out.println("Plate constructor"); } } class DinnerPlate extends Plate { //聲明餐盤為盤子的子類 public DinnerPlate(int i) { super(i); System.out.println("DinnerPlate constructor"); } },4 類的組合,4.1 組合與繼承的結(jié)合(續(xù))——例,74,class Utensil { //聲明器具 Utensil(int i) { System.out.println("Utensil constructor"); } } class Spoon extends Utensil { //聲明勺子為器具的子類 public Spoon(int i) { super(i); System.out.println("Spoon constructor"); } },4 類的組合,4.1 組合與繼承的結(jié)合(續(xù))——例,75,class Fork extends Utensil { //聲明餐叉為器具的子類 public Fork(int i) { super(i); System.out.println("Fork constructor"); } } class Knife extends Utensil { //聲明餐刀為器具的子類 public Knife(int i) { super(i); System.out.println("Knife constructor"); } },4 類的組合,4.1 組合與繼承的結(jié)合(續(xù))——例,76,class Custom { // 聲明做某事的習(xí)慣 public Custom(int i) { System.out.println("Custom constructor");} } public class PlaceSetting extends Custom {//聲明餐桌的布置 Spoon sp; Fork frk; Knife kn; DinnerPlate pl; public PlaceSetting(int i) { super(i + 1); sp = new Spoon(i + 2); frk = new Fork(i + 3); kn = new Knife(i + 4); pl = new DinnerPlate(i + 5); System.out.println("PlaceSetting constructor"); } public static void main(String[] args) { PlaceSetting x = new PlaceSetting(9); } },4 類的組合,4.1 組合與繼承的結(jié)合(續(xù))——例,77,運行結(jié)果 Custom constructor Utensil constructor Spoon constructor Utensil constructor Fork constructor Utensil constructor Knife constructor Plate constructor DinnerPlate constructor PlaceSetting constructor,4 類的組合,4.1 組合與繼承的結(jié)合(續(xù))——例運行結(jié)果,- 1.請仔細(xì)閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
5 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該PPT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 信息系統(tǒng) 開發(fā) 系統(tǒng) 方法 工具 演示 文檔
鏈接地址:http://m.hcyjhs8.com/p-249537.html