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