欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    识别关系(关联)—物件如何取用其他物件的服务.ppt

    • 资源ID:70968958       资源大小:501KB        全文页数:54页
    • 资源格式: PPT        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    识别关系(关联)—物件如何取用其他物件的服务.ppt

    識別關係(關聯)物件如何取用其他物件的服務n關係是類別之間的連接,指的是提供系統內的訊息往來路徑,意即物件如何取用其它物件的服務。n關係是指類別之間在意義上的關係,具體來說分為下列情況:q類別A對類別B送出訊息(A使用B的方法)。q類別A產生類別B(A使用new B()。q類別A的屬性值是類別B或是類別B的集合(A是B的父類別或者A是B的元件)。q類別A有著一種訊息,其參數為類別B。n關係也可以視為一種物件。例如q某個人對銀行產生存款這個關聯之後,就會產出帳戶。q帳戶是一種物件,本身有專屬的屬性和方法。1關係分類n一般化(繼承關係)q表示將擁有共同性質的部份抽取出來的動作,通常針對類別來進行。在一般化當中,父類別具有子類別的共同特性。qB是A的一種B是A的一種特殊情況這種關係被抽取出來就叫一般化。而能夠從A去繼承那一個函式或屬性,則叫做繼承。n組合(Composition)與聚合(Aggregation)q聚合:類別A是由類別B所構成,但是類別B可以離開類別A而獨立存在。例如,公司與員工的關係;資料夾與檔案的關係。q組合:是將聚合強化而成,在組合裡面,部分的類別是不能從整體的類別切割出來。例如,公司與部門的關係是如此。n連結q不同類別之間的1對1、1對多或多對多關係。2類別的繼承 n繼承(Inheritance)是物件導向程式設計的重要觀念,繼承是指宣告類別繼承現存類別的部分或全部的成員變數和方法、新增額外的成員變數和方法或覆寫和隱藏繼承類別的方法或變數。n類別的繼承關係可以建立類別架構,在UML類別關係中,繼承是一般關係(Generalization)。例如:類別Student是繼承自類別Person。3類別的繼承n類別架構:繼承不只可以多個子類別繼承同一個父類別,而且可以擁有很多層的繼承。如下圖所示:nTruck、Car和Motorcycle類別是兄弟類別,因為擁有相同的Vehicle父類別。n當然我們可以繼續繼承類別Car,類別SportsCar和Jeep也是類別Vehicle的子類別,不過並不是直接繼承的子類別。4類別的繼承-父類別(一般化)n在Java宣告繼承的子類別前,我們需要先有一個父類別來繼承。稱為一般化,例如:學生與老師的類別宣告如下:Class Student private int score;private int id;private String name;private double height;public Student()public Student(int id,String n,double h,int score)public void studentInfo()public void setID(int id)public void setName(String n)public void setHeight(double h)Class Teacher private int teacherNO;private int id;private String name;private double height;public Teacher()public Teacher(int id,String n,double h)public void teacherInfo()public void setID(int id)public void setName(String n)public void setHeight(double h)5類別的繼承-父類別(一般化)n父類別Person定義個人的基本資料,類別宣告如下所示:class Person private int id;private String name;private double height;public void setID(int id)public void setName(String n)public void setHeight(double h)public void personInfo()6類別的繼承-繼承的語法n在Java語言是使用extends關鍵字來宣告類別繼承存在的類別,其宣告語法,如下所示:class 子類別名稱 extends 父類別名稱 /額外的成員變數和方法 n上述語法表示擴充父類別的原型宣告。n以學生Student子類別的宣告為例,其類別宣告如下所示:class Student extends Person private int score;public Student()public Student(int id,String n,double h,int score)public void studentInfo()範例程式:http:/mail.tajen.edu.tw/reler/object/Ch11_1_2.javan那麼老師Teacher子類別該如何宣告?7類別的繼承UML類別圖8物件建構過程9類別的繼承繼承的存取限制n子類別可以繼承父類別的所有成員變數和方法,但是在存取時仍然有一些限制,如下所示:q子類別不能存取父類別宣告成private的成員變數和方法。q父類別的建構子不屬於子類別的方法,所以子類別並不能繼承父類別的建構子,只能呼叫父類別的建構子。10類別的繼承-使用protected修飾子宣告nJava存取修飾子protected是指宣告的成員方法或變數可以在同一類別、其子類別或同一套件存取,其存取權限介於public和private之間。nJava語言的存取修飾子public、private和protected擁有不同的存取權限範圍:qpublic:擁有全域範圍,任何類別都可以存取,包含子類別。qprivate:只可以在同一個類別存取,不可以在子類別存取。qprotected:可以在同一個類別、其子類別或同一套件中存取,包含不同套件的子類別。q沒有使用存取修飾子:沒有使用存取修飾子:預設範圍是同一個類別和套件中存取,但不包含不同套件的子類別。protected則包含不同套件的子類別,所以其存取範圍比protected還小。11類別的繼承-使用protected修飾子宣告n例如,在程式範例Ch11_1_2.java中,重新宣告Person的屬性為protected,則Student子類別即可直接取用不需要透過呼叫父類別的方法。Class Person protected int id;protected String name;protected double height;.Class Student extends Personprivate int score;public Student(int id,String n,double h,int score)this.id=id;name=n;height=h;this.score=score;範例程式:http:/mail.tajen.edu.tw/reler/object/Ch11_1_3.java12類別的繼承-覆寫和隱藏父類別的方法n繼承的父類別方法如果不符合需求,在子類別可以宣告同名、同參數列和傳回值的方法來取代父類別繼承的方法,稱為覆寫(Override),或稱為覆蓋。n不過,物件的實例方法不能取代宣告成static的類別方法。如果父類別擁有類別方法,在子類別需要宣告同樣的類別方法來取代它,稱為隱藏(Hide)。13類別的繼承-覆寫和隱藏父類別的方法n在父類別Person的類別方法和成員方法需要被隱藏和覆寫,其類別宣告如下所示:class Person public static void printClassName()public void personInfo()n子類別Student繼承自父類別Person,其類別宣告如下所示:class Student extends Person public static void printClassName()public void personInfo()14類別的繼承-覆寫和隱藏父類別的方法n在UML類別圖示並不會特別標示覆寫方法,如下圖所示:15類別的繼承-隱藏父類別的個體變數n在子類別除了覆寫父類別的成員方法和隱藏類別方法外,子類別也可以隱藏父類別的成員變數。n子類別只需變數名稱相同,就算變數的資料型態不同,也一樣可以隱藏父類別的成員變數。n例如:父類別Person的成員變數id是宣告成public的整數資料型態,其類別宣告如下所示:class Person public int id;.n在子類別Student是繼承自父類別Person,其類別宣告如下所示:class Student extends Person private String id;16類別的繼承-隱藏父類別的成員變數-UML類別圖n在UML類別圖示並不會特別標示隱藏變數,在父和子類別都會有同名但型態和存取修飾子不同的成員變數id,如下圖所示:17類別的繼承-使用父類別的建構子n在Java子類別並不能繼承父類別的建構子,只能使用super關鍵字呼叫父類別的建構子;同理,在子類別覆寫的方法和隱藏的成員變數,也可以使用super來呼叫和存取。n例如:在父類別Person擁有建構子,其類別宣告如下所示:class Person public static int count=0;public int id;public String name;public Person()public Person(int id,String name)public void personInfo()18類別的繼承-使用父類別的建構子n在子類別Student是繼承自父類別Person,如下所示:class Student extends Person private int score;public Student(int id,String n,String no,int score)super(id,n);/Person(int id,String n);public void personInfo()super.personInfo();System.out.println(姓名(父):+super.name);System.out.println(字號(父):+super.id);19類別的繼承-繼承關係下的Constructor執行順序 n先將所有變數設為內定值。對數值型態來說,其值為0;對reference來說,其值為null;對boolean來說,其值為false。n呼叫父類別的constructor。如果子類別Constructor裡沒有指定父類別的Constructor,則使用父類別沒有參數的Constructor。n執行變數宣告的初始化動作。n執行自己的constructor。n如果要指定父類別其他的constructor,則必須在子類別的constructor的第一行使用關鍵字super來處理。20類別的繼承-繼承關係下的Constructor執行順序class A1 private int a;public A1()a=100;public A1(int a)this.a=a;public class B1 extends A1 private int b;public B1()/Compiler add super()here,系統自動新增 b=110;public B1(int b)/*若有super,則必須放在第一行,連變數宣告也不能擺在super前面*/super(b);/系統會增加哪一個建構子?b=b+10;21抽象類別(abstract class)n使用時機q當某類別只是在定義一些抽象概念,並不是想利用此類別實作一個物件。換句話說,它並不能用來建立物件實體,抽象類別擁有眾多類別的共同部分,主要的目是是作為其它類別的父類別22抽象類別(abstract class)-(圖例說明)n類別架構中的父類別是哺乳類(Mammal),Mouse、Human和Dog類別是繼承自Mammal類別,因為老鼠、人和狗都屬於哺乳類動物,我們可以使用Mouse、Human和Dog類別建立模擬老鼠、人和狗等物件。n事實上,並沒有任何動物叫哺乳類,所以並不會建立模擬哺乳類的物件,這個類別只是描述哺乳類動物的共同特徵,以便其它屬於哺乳類的動物繼承此物件,換句話說,Mammal類別就是一個抽象類別。23抽象函式(abstract method)與抽象類別(abstract class)n定義qJava 提供了一種不完全的函式,只有宣告而無本體,稱為抽象函式(abstract mehtod)。q類別內部有尚未定義實作內容的函式(抽象函式),則此類別必須宣告為 abstract class,便需以關鍵字abstract做為這個Class的修飾詞。q我們也可以將不含任何abstract methods的Class宣告為abstract。q如果你繼承一個abstract class,並且希望為新型別產生物件,那麼你得為父類別中的所有abstract methods都提供相對應的函式內容(程式碼),否則編譯器會產生錯誤。24抽象函式(abstract method)與抽象類別(abstract class)n宣告方法qabstract class ABCD abstract void play();String what()/*Codes*/n特性q宣告為 abstract 的類別無法產生實體。例如,您無法對上述類別做以下的宣告:ABCD myABCD=new ABCD();25抽象類別-UML類別圖26抽象類別-宣告抽象類別n例如:抽象類別Account宣告,如下所示:abstract class Account public String accountid;private double amount;public double interest;public abstract void calInterest();/計息 public void setBalance(double a)public double getBalance()/結餘範例:http:/mail.tajen.edu.tw/reler/object/Ch12_3.java27抽象類別-繼承抽象類別class SavingAccount extends Account public boolean haveCard;public SavingAccount(String id,double amount,double interest,boolean haveCard)public void calInterest()/需要進行實作方法 double amount=getBalance();System.out.println(利息:“+(amount*interest);28抽象類別-抽象類別的物件變數宣告n抽象類別不能建立物件,但是可以作為資料型態,宣告參考子類別的物件變數,如下所示:Account s2=new SavingAccount(002-10-333-123,15000.00,0.02,false);n父類別的物件變數可以參考子類別的物件,以口語來說:SavingAccount物件也是一種Account物件。nAccount物件變數可以參考SavingAccount物件呼叫實作的抽象方法calInterest(),如:s2.calInterest();nAccount物件變數並不能呼叫或存取子類別新增的成員變數與方法,只能存取抽象類別所宣告的變數與方法。如:s2.interest;(是不允許的)29抽象類別-抽象類別的物件變數存取子類別的成員nAccount類別的物件變數s2儲存的是SavingAccount物件的參考,但是並不能呼叫或存取子類別新增的成員變數與方法,如果需要存取子類別的成員,請先型態轉換成SavingAccount類別的物件變數,如下所示:SavingAccount s;s=(SavingAccount)s2;nJava提供instanceof運算子判斷物件變數參考的哪一種物件,如下所示:if(s2 instanceof SavingAccount).上述 if 條件檢查物件變數s2是否是參考到SavingAccount物件,如果true,就可以執行程式區塊的程式碼30介面(Interface)的基礎-說明n定義:q一段只有常數與函式宣告,但沒有函式實作的程式碼。n作用:q讓某個功能,不論由誰實作,都能夠有相同的函式名稱,傳入值,傳出值,與存取範圍。nInterface 的主要用意,是用來定義同一類物件的共同要件。也就是定義物件或類別應該具備哪些功能(method),才夠資格成為該類物件。(補充說明)31介面(Interface)-UML類別圖nJava介面也是使用UML類別圖,只是在類別名稱上方使用模板型態(Stereotype)指明此為介面,如下圖所示:32介面的建立與使用-介面宣告(1)n在Java介面可以宣告常數和方法,方法是一種抽象方法(Abstract Method),表示只有宣告沒有程式碼,其宣告語法如下所示:public interface 介面名稱 extends 父介面名稱 public static final 資料型態 常數=值;.public abstract 傳回值型態 介面方法(參數列);33介面的建立與使用-介面宣告(2)nInterface中宣告的變數變數具有以下特質 qpublic。所謂Interface(界面)指的是外界觀看某物件時,所能看到的表象以及溝通的管道,因此Interface內的成員一定是public。也就是說即便宣告時沒寫public關鍵字,Compiler也會幫我們加上去。qstatic。既然Interface沒有實作,就不可能透過Interface產生物件。換言之,Interface內的變數一定是屬於Class,而不屬於Object。qfinal。Interface可視為一種約定或契約,我們自然不希望裡面的variable可以隨便更改。既然是final,則須要給定一個常數值。34介面的建立與使用-介面宣告(3)nInterface中宣告的method具有以下特質 qpublic。同變數說明。qabstract。Interface沒有實作,裡面定義的method只是宣告而已。沒有實作的method,在Java裡用abstract這個關鍵字來表達。35介面的建立與使用-介面範例n例如:IArea介面宣告如下所示:interface IArea /*public static*/final double PI=3.1415926;/*public abstract*/void area();n上述介面擁有一個常數PI和方法area()。36介面的建立與使用-類別實作介面(語法)nJava類別可以實作介面,也就是建立介面方法的程式碼,其宣告語法如下所示:class 類別名稱 implements 介面名稱1,介面名稱2 /實作的介面方法,意即增加程式碼n上述類別使用implements關鍵字實作介面,如果實作介面不只一個,請使用,逗號分隔,在類別宣告內需要實作所有介面的方法。37介面的建立與使用-類別實作介面(範例)n例如:Circle類別實作IArea介面,其類別宣告如下所示:class Circle implements IArea public void area()System.out.println(圓面積:+PI*r*r);38介面的建立與使用-類別實作介面(UML類別圖)39在類別實作多個介面-介面宣告nJava類別可以實作多個介面。例如:IArea和IShow兩個介面宣告,如下所示:interface IArea final double PI=3.1415926;void area();interface IShow void show();40在類別實作多個介面-實作介面class Circle implements IArea,IShow public void area()public void show()41在類別實作多個介面-UML類別圖42介面的繼承-說明與宣告nJava介面並不能隨便新增方法,因為實作介面的類別需要實作所有介面方法。如果新增介面的抽象方法,就需要新增所有實作此介面的類別方法。n我們可以使用介面繼承方式來擴充介面,增加介面的抽象方法,其宣告語法如下所示:interface 介面名稱 extends 繼承的介面 /額外的常數和方法n上述宣告的介面繼承其他介面的所有常數和方法。43介面的繼承-範例n例如:繼承IArea介面,其介面宣告如下所示:interface IShape extends IArea void perimeter();n上述介面IShape繼承自IArea介面,新增perimeter()介面方法。44介面的繼承-UML類別圖45介面的多重繼承說明(1)n多重繼承(Multiple Inheritance)是指一個類別能夠繼承多個父類別,意即一個 class 有多於一個以上的 superclasses。如下圖所示:46介面的多重繼承說明(2)n傳統的多繼承有個有名的大問題稱之為diamond problem。(補充說明)nJava 只支援單繼承,也就是說每一個類別最多只能繼承(extends)一個 abstract 或者 concrete(也就是沒有任何的 abstract member)的類別。雖然在很多時候,我們必須繼承一個以上的類別,可是我們又希望能避免 diamond problem,因此在 Java 內我們利用 interfaces 來達到多重繼承的特色。47介面的多重繼承-語法n在Java語言的介面支援多重繼承,其宣告的語法如下所示:interface介面名稱 extends繼承的介面1,繼承的介面2 /額外的常數和方法n上述介面宣告繼承多個介面,各介面使用,逗號分隔。n例如:IShape介面繼承自IArea和IShow介面,其介面宣告如下所示:interface IShape extends IArea,IShow void perimeter();n上述介面IShape是繼承自IArea和IShow介面,新增perimeter()方法。48介面的多重繼承-UML類別圖49為何不用 abstract class?n如果把外掛功能做成 abstract class 而不是 interface,會使得需要此外掛功能的 class 一定得繼承這個 abstract class。如此一來,它就不能繼承其它的類別了。(Java 不支援多重繼承)n因為多重繼承會有問題,但實際上又有多重繼承的需要,所以發明了 interface,作為折衷的替代方案。50Interface注意事項n如果某介面繼承另一個介面,則 subclass 能從 superclass 繼承到的只有常數與函式宣告而已。n介面一旦公佈出去,開始供大家使用後,就請盡量不要更改。因為一旦更改,那些已經使用此介面的程式會因無法實作新功能,而不能執行。n如果真要更改,請宣告新介面,其它人就可以決定要實作一個介面或兩個介面都實作。51抽象類別與介面的差異n在抽象類別中的方法可以宣告成抽象方法,也可以是一般方法;介面方法就只有宣告,在介面一定不會有實作程式碼。n介面並不屬於類別的繼承架構;抽象類別則屬於類別的繼承架構。抽象類別一定是繼承架構的父類別,但是,就算亳無關係的類別也一樣可以實作同一個介面。n一個類別只能繼承一個抽象類別,但是可以同時實作多個介面。52抽象類別與介面-介面的物件變數1n我們一樣可以使用介面來宣告物件變數,參考到實作此介面的物件,如下所示:IPerimeter r3=new Rectangle(15.0,15.0,4.0,8.0);n以口語來說:Rectangle物件就是一種實作IPerimeter介面的物件。n因為IPerimeter宣告的物件變數可以參考Rectangle物件,所以,可以呼叫實作的介面方法perimeter(),如下所示:r3.perimeter();53抽象類別與介面-介面的物件變數2n如同抽象類別宣告的物件變數,當介面宣告的物件變數需要存取其參考類別的成員時,我們需要先型態轉換成Rectangle類別的物件變數,如下所示:Rectangle r;r=(Rectangle)r3;54

    注意事项

    本文(识别关系(关联)—物件如何取用其他物件的服务.ppt)为本站会员(hyn****60)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开