JAVA程序設(shè)計(jì)實(shí)用教程04類(lèi)的封裝性繼承性多態(tài)性與接口.ppt_第1頁(yè)
JAVA程序設(shè)計(jì)實(shí)用教程04類(lèi)的封裝性繼承性多態(tài)性與接口.ppt_第2頁(yè)
JAVA程序設(shè)計(jì)實(shí)用教程04類(lèi)的封裝性繼承性多態(tài)性與接口.ppt_第3頁(yè)
JAVA程序設(shè)計(jì)實(shí)用教程04類(lèi)的封裝性繼承性多態(tài)性與接口.ppt_第4頁(yè)
JAVA程序設(shè)計(jì)實(shí)用教程04類(lèi)的封裝性繼承性多態(tài)性與接口.ppt_第5頁(yè)
已閱讀5頁(yè),還剩97頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第四章 類(lèi)的封裝性、繼承性、多態(tài)性與接口前言本章的目的:類(lèi)的三大特性(封裝性、繼承性、多態(tài)性)、extends、super、方法重載與覆蓋、接口(interface)、抽象類(lèi)(abstract)、特殊的類(lèi)(實(shí)名內(nèi)部類(lèi)、匿名內(nèi)部類(lèi)、泛型類(lèi)、Class類(lèi))回顧關(guān)鍵詞:類(lèi)、對(duì)象、對(duì)象生成(new)、對(duì)象清除、對(duì)象的內(nèi)存分配、構(gòu)造方法、main方法、this、static、final、import小題目1、 下列程序有沒(méi)有錯(cuò)誤?class CMethod int i; int j; static int s; public void add() s=i+j; static void add(int i

2、, int j) this.i=i; this.j=j; s=i+j; 小節(jié)安排類(lèi)的封裝性、繼承性、多態(tài)性與接口4.1、封裝性4.2、繼承性4.3、多態(tài)性4.4、抽象類(lèi)4.5、接口4.6、內(nèi)部類(lèi)4.1 封裝性目的限制在類(lèi)的外部對(duì)類(lèi)內(nèi)部成員進(jìn)行訪(fǎng)問(wèn),只通過(guò)公共接口來(lái)訪(fǎng)問(wèn)類(lèi)的成員數(shù)據(jù)。屏蔽細(xì)節(jié):這是程序設(shè)計(jì)的基本思想方法,便于程序功能的擴(kuò)展和程序的維護(hù)。封裝類(lèi)大多數(shù)變量都是私有的,變量通過(guò)他們自己類(lèi)的方法修改,其它類(lèi)都只與一個(gè)類(lèi)中很少的幾部分接口;若變量或方法為公有,它就是接口的一部分,其它類(lèi)可以訪(fǎng)問(wèn)它;若為私有,它是實(shí)現(xiàn)的一部分,只有類(lèi)自己的成員可以訪(fǎng)問(wèn)它訪(fǎng)問(wèn)權(quán)限的設(shè)置權(quán)限同一類(lèi)同一包不同包的子

3、類(lèi)所有類(lèi)public允許允許允許允許protected允許允許允許不允許默認(rèn)允許允許不允許不允許private允許不允許不允許不允許類(lèi)的訪(fǎng)問(wèn)權(quán)限的設(shè)置類(lèi)的權(quán)限有兩種:默認(rèn)和public。如果在一個(gè)源程序文件中,聲明了若干個(gè)類(lèi)的話(huà),只能有一個(gè)類(lèi)的權(quán)限關(guān)鍵字是public。這個(gè)類(lèi)的名字應(yīng)該和程序文件同名,main方法也應(yīng)該在這個(gè)類(lèi)中,否則程序無(wú)法執(zhí)行。類(lèi)的成員的訪(fǎng)問(wèn)權(quán)限設(shè)置用權(quán)限關(guān)鍵字設(shè)置類(lèi)的成員的權(quán)限,以此決定是否允許其類(lèi)外部的代碼訪(fǎng)問(wèn)這些成員。例: private int name,sex,age,stuID; public void setName(String name);訪(fǎng)問(wèn)控制方式:p

4、ublic被修飾為public的類(lèi)是公共類(lèi),它可供所在包的其他類(lèi)使用,也可供其他包中的類(lèi)使用,在程序中可以用import語(yǔ)句引入其他包中的public類(lèi)。被public定義的類(lèi)中成員變量或方法可以供其他類(lèi)訪(fǎng)問(wèn),表明對(duì)外開(kāi)放的方式;一般類(lèi)的定義中,含有少量(或者沒(méi)有) public 變量,部分 public 方法。訪(fǎng)問(wèn)控制方式:private設(shè)置private訪(fǎng)問(wèn)權(quán)限,則該類(lèi)的成員只能被同一類(lèi)中的成員訪(fǎng)問(wèn),而不讓其他類(lèi)進(jìn)行訪(fǎng)問(wèn)。目的: 隱藏具體的實(shí)現(xiàn)細(xì)節(jié)變量常常是private 采用 public “get” 方法讀取數(shù)據(jù)采用 public “set”方法寫(xiě)數(shù)據(jù)訪(fǎng)問(wèn)控制方式:protected同

5、一個(gè)包內(nèi)的所有類(lèi)的所有方法都能訪(fǎng)問(wèn)該成員如果不在同一個(gè)包內(nèi)的類(lèi)的方法要訪(fǎng)問(wèn)該成員,則該類(lèi)必須是該成員所在的類(lèi)的子類(lèi)訪(fǎng)問(wèn)控制方式: 默認(rèn) (缺省方式)默認(rèn)的權(quán)限,該類(lèi)的成員能被同一包中的類(lèi)訪(fǎng)問(wèn)。封裝性的可以帶來(lái)的優(yōu)點(diǎn)基本思想: 提供對(duì)外的通訊方式,封裝內(nèi)部的實(shí)現(xiàn)機(jī)制增加內(nèi)部實(shí)現(xiàn)部分的可替換性減小類(lèi)之間的耦合關(guān)系,方便模塊劃分容易保證類(lèi)內(nèi)部數(shù)據(jù)間的一致性,從而提高軟件的可靠性何時(shí)為public或private?基本思想類(lèi)常常是public成員變量常常是private. 構(gòu)造方法一般是public. 方法“get”與“set”是 public. 其它方法需要根據(jù)實(shí)際的需要而定上面的思想可以用于大部分

6、的程序設(shè)計(jì)(也許90%)例子:根據(jù)以下的設(shè)計(jì)要求編寫(xiě)java源代碼。類(lèi)名: Student變量(訪(fǎng)問(wèn)權(quán)限均為private):name(String) /姓名age(int) /年齡方法:構(gòu)造方法(沒(méi)有參數(shù),設(shè)置姓名為“無(wú)名氏”,年齡為20)setName(有一個(gè)名為name的String型參數(shù),將name的值設(shè)為這個(gè)新值),getName (沒(méi)有參數(shù),返回姓名)setAge(有一個(gè)名為age的int型參數(shù),將age的值設(shè)為這個(gè)新值),getAge (沒(méi)有參數(shù),返回年齡)isSameAge(有一個(gè)參數(shù)s,是另一個(gè)Student對(duì)象的引用,如果兩個(gè)Student對(duì)象的age相同,則返回true,

7、否則返回false)public class Studentprivate String name;private int age;public Student()name=無(wú)名氏;age=20;public void setName(String name)=name;public String getName()return name;public void setAge(int age)this.age=age;public int getAge()return age;public boolean isSameAge(Student s)if(s.age-this.a

8、ge=0) return true;return false;public static void main(String args)Student s1=new Student();Student s2=new Student();s2.age=20;System.out.println(s1.isSameAge(s2);Student類(lèi)(續(xù))某Java源程序中有一個(gè)類(lèi)的定義為:public class MyPrg,則該源程序的文件名應(yīng)該為:_ 。小題目MyPrg.java對(duì)象是用_關(guān)鍵字實(shí)例化類(lèi)之后的結(jié)果,_訪(fǎng)問(wèn)修飾符所聲明的類(lèi)成員,僅能被同包(同路徑)或具有繼承關(guān)系的相關(guān)類(lèi)使用。newp

9、rotected閱讀下列程序,輸出結(jié)果是( )public class Example String str=new String(hello); char ch=d,b,c; public static void main(String args) Example ex=new Example(); ex.change(ex.str,ex.ch); System.out.println(ex.str+and+ex.ch0); public void change(String str,char ch) str=world; ch0= a; A. hello and d B. hello an

10、d a C. world and d D. world and a 小題目BTest.java程序代碼如下,以上程序編譯后用如下命令運(yùn)行: java Test 1 2 3 4 運(yùn)行的輸出結(jié)果是什么?( ) public class Test public static void main(String args) System.out.println(args2); A. 1 B. 2 C. 3 D. 4 小題目C小節(jié)安排類(lèi)的封裝性、繼承性、多態(tài)性與接口4.1、封裝性4.2、繼承性4.3、多態(tài)性4.4、抽象類(lèi)4.5、接口4.6、內(nèi)部類(lèi)4.2、繼承性繼承是復(fù)用程序代碼的有力手段,當(dāng)多個(gè)類(lèi)(Sub

11、1,Sub2)之間存在相同的屬性和方法時(shí),可從這些類(lèi)抽象出父類(lèi)SuperClass。被繼承的類(lèi)稱(chēng)為超類(lèi)(父類(lèi))。從超類(lèi)派生出來(lái)(繼承超類(lèi))的新類(lèi)稱(chēng)子類(lèi)。Java只支持單重繼承,不支持多重繼承繼承的層次結(jié)構(gòu)一個(gè)子類(lèi)成為另一個(gè)子類(lèi)的超類(lèi)。人學(xué)生行政人員教師本科生研究生繼承的基本語(yǔ)法 class extends 子類(lèi)體 例:public class SubClass extends SuperClass Student和Teacher繼承People25例:Student和Teacher繼承Peoplepublic class People String name;char sex;int age;

12、public String getName()return name;public char getSex()return sex;public int getAge()return age;public void printInfo()System.out.println(“name:”+name+“ sex:”+sex+“ age:”+age);例:Student和Teacher繼承Peoplepublic class Student extends PeopleString studentID;String major;public String getMajor()return maj

13、or;public String getStudentID()return studentID;例:Student和Teacher繼承Peoplepublic class Teacher extends PeopleString teacherID;String department;public String getDepartment()return department;public String getTeacherID()return teacherID;子類(lèi)繼承超類(lèi)的成員變量繼承原則:子類(lèi)只繼承超類(lèi)中非private的成員變量隱藏原則:子類(lèi)的成員變量和超類(lèi)的成員變量同名時(shí),超類(lèi)的成

14、員變量被隱藏(不能繼承)子類(lèi)繼承超類(lèi)的成員方法繼承原則:子類(lèi)只繼承超類(lèi)中非private的成員方法。覆蓋原則:子類(lèi)的成員方法和超類(lèi)的成員方法同名時(shí),超類(lèi)的成員方法被子類(lèi)的成員方法覆蓋(不能繼承)。super關(guān)鍵字super表示對(duì)某個(gè)類(lèi)的超類(lèi)的引用。如子類(lèi)和超類(lèi)有同名的成員變量或方法,則:super.super.表示引用超類(lèi)的成員(如無(wú)super則表示子類(lèi)中的同名成員)this關(guān)鍵字在類(lèi)定義中的方法中需要引用正在使用該方法的對(duì)象時(shí),可以用“this”表示。用this引用的使用方法如下:用this指代對(duì)象本身訪(fǎng)問(wèn)本類(lèi)的成員: this. this.調(diào)用本類(lèi)的構(gòu)造方法: this(參數(shù)列表)構(gòu)造方法

15、的繼承構(gòu)造方法不存在繼承關(guān)系。如果子類(lèi)沒(méi)有構(gòu)造方法,則它默認(rèn)調(diào)用超類(lèi)無(wú)參數(shù)的構(gòu)造方法;如果子類(lèi)有構(gòu)造方法,那么在創(chuàng)建子類(lèi)的對(duì)象時(shí),則將先執(zhí)行超類(lèi)的構(gòu)造方法,然后再執(zhí)行自己的構(gòu)造方法。對(duì)于超類(lèi)中包含有參數(shù)的構(gòu)造方法,子類(lèi)可以通過(guò)在自己的構(gòu)造方法中使用super關(guān)鍵字來(lái)引用,而且必須是子類(lèi)構(gòu)造方法中的第一條語(yǔ)句。用super調(diào)用超類(lèi)的構(gòu)造方法:super(參數(shù)列表)例:通過(guò)super關(guān)鍵字實(shí)現(xiàn)對(duì)父類(lèi)構(gòu)造方法與成員方法的訪(fǎng)問(wèn)class People private String name ;private char sex;private int age;public People(String n

16、ame,char sex,int age) = name;this.sex=sex;this.age = age;public String getDetails( )return Name:+name+nsex:+sex+nage: +age;例:通過(guò)super關(guān)鍵字實(shí)現(xiàn)對(duì)父類(lèi)構(gòu)造方法與成員方法的訪(fǎng)問(wèn)class Student extends People private String studentID;private String major;public Student(String name,char sex,int age,String stuID,String

17、major)super(name,sex,age);this.studentID=stuID;this.major=major;public String getDetails( )return super.getDetails( )+nStudentID:+ studentID+nMajor:+major;public class TestSuperpublic static void main(String srgs)Student s = new Student(TOM,男,20,20070308017,Computer);System.out.println(s.getDetails(

18、);子類(lèi)對(duì)象的創(chuàng)建與實(shí)例化過(guò)程1、分配對(duì)象所需的全部?jī)?nèi)存空間,并初始化為“0”值2、按繼承關(guān)系,自頂向下顯式初始化3、按繼承關(guān)系,從頂向下調(diào)用構(gòu)造方法注意:一般子類(lèi)構(gòu)造方法的第1行通過(guò)super來(lái)調(diào)用父類(lèi)的構(gòu)造方法,若不使用super關(guān)鍵字指定,則自動(dòng)調(diào)用父類(lèi)的無(wú)參數(shù)構(gòu)造方法。如果父類(lèi)中沒(méi)有無(wú)參數(shù)的構(gòu)造方法,則將產(chǎn)生錯(cuò)誤。子類(lèi)對(duì)象的創(chuàng)建與實(shí)例化過(guò)程需要注意的是,若子類(lèi)調(diào)用父類(lèi)的構(gòu)造方法,在子類(lèi)的構(gòu)造方法中省略掉super關(guān)鍵字,則系統(tǒng)默認(rèn)有“super()”,即調(diào)用父類(lèi)不帶參數(shù)的構(gòu)造方法。由于Java語(yǔ)言規(guī)定如果一個(gè)類(lèi)中含有一個(gè)或多個(gè)構(gòu)造方法,系統(tǒng)不提供默認(rèn)的構(gòu)造方法(不含參數(shù)的構(gòu)造方法),所

19、以當(dāng)在父類(lèi)中定義了多個(gè)構(gòu)造方法時(shí),應(yīng)考慮包括一個(gè)不帶參數(shù)的構(gòu)造方法,以防止子類(lèi)省略super關(guān)鍵字時(shí)出現(xiàn)錯(cuò)誤。class Member int instanceVar; Member(int i) instanceVar=i; class SubMember extends MemberSubMember(int j) instanceVar=j; public class ExtendsTest public static void main(String args) Member m1 = new Member(); Member m2 = new Member(); SubMember

20、m3=new SubMember(3);class Member int instanceVar; Member(int i) instanceVar=i; class SubMember extends MemberSubMember(int j) instanceVar=j; public class ExtendsTest public static void main(String args) Member m1 = new Member(1); Member m2 = new Member(2); SubMember m3=new SubMember(3);class Member

21、int instanceVar; Member(int i) instanceVar=i; class SubMember extends MemberSubMember(int j) super(j); instanceVar=j; public class ExtendsTest public static void main(String args) Member m1 = new Member(1); Member m2 = new Member(2); SubMember m3=new SubMember(3);正確!class Member int instanceVar; Mem

22、ber(int i) instanceVar=i; Member() class SubMember extends MemberSubMember(int j) super(j); instanceVar=j; public class ExtendsTest public static void main(String args) Member m1 = new Member(1); Member m2 = new Member(2); SubMember m3=new SubMember(3);正確!class Member int instanceVar; Member(int i)

23、instanceVar=i; Member() class SubMember extends MemberSubMember(int j) instanceVar=j; public class ExtendsTest public static void main(String args) Member m1 = new Member(); Member m2 = new Member(); SubMember m3=new SubMember(3);正確!class Member int instanceVar; Member(int i) instanceVar=i; Member()

24、 class SubMember extends MemberSubMember(int j) Super(j); instanceVar=j; public class ExtendsTest public static void main(String args) Member m1 = new Member(); Member m2 = new Member(); SubMember m3=new SubMember(3);正確!練習(xí):閱讀下面的程序,經(jīng)編譯后,運(yùn)行結(jié)果是什么class Super public int i=0; public Super() i=1; public cl

25、ass Sub extends Super public Sub() i=2; public static void main(String args) Sub s=new Sub(); System.out.println(s.i); 練習(xí):閱讀下面的程序,經(jīng)編譯后,運(yùn)行結(jié)果是什么class Super public int i=0; public Super() i=1; public class Sub extends Super public Sub() i=2; public static void main(String args) Sub s=new Sub(); System.

26、out.println(s.i); 運(yùn)行結(jié)果:2練習(xí):閱讀下面的程序,經(jīng)編譯后,運(yùn)行結(jié)果是什么class Person public Person() System.out.println(hi!); public Person(String s) this(); System.out.println(I am +s); public class Who extends Person public Who() this(I am Tony); public Who(String s) super(s); System.out.println(How do you do?); public st

27、atic void main(String args) Who w = new Who(Tom); Hi!I am TomHow do you do?練習(xí):閱讀下面的程序,經(jīng)編譯后,運(yùn)行結(jié)果是什么class Person public Person() System.out.println(hi!); public Person(String s) this(); System.out.println(I am +s); public class Who extends Person public Who() this(I am Tony); public Who(String s) supe

28、r(s); System.out.println(How do you do?); public static void main(String args) Who w = new Who(); Hi!I am I am TonyHow do you do?繼承關(guān)系中對(duì)成員的訪(fǎng)問(wèn)(最近匹配原則) (1)在子類(lèi)中訪(fǎng)問(wèn)屬性和方法時(shí)將優(yōu)先查找自己定義的屬性和方法。如果該成員在本類(lèi)存在,則使用本類(lèi)的,否則,按照繼承層次的順序到其祖先類(lèi)查找。(2)this關(guān)鍵字特指本類(lèi)的對(duì)象引用,使用this訪(fǎng)問(wèn)成員則首先在本類(lèi)中查找,如果沒(méi)有,則到父類(lèi)逐層向上找。(3)super特指訪(fǎng)問(wèn)父類(lèi)的成員,使用super首先

29、到直接父類(lèi)查找匹配成員,如果未找到,再逐層向上到祖先類(lèi)查找終止繼承出于安全性方面的考慮,要避免子類(lèi)繼承超類(lèi)的某個(gè)方法,可以使用“final”關(guān)鍵字來(lái)使繼承終止。 這樣使此方法不會(huì)在子類(lèi)中被覆蓋(即子類(lèi)中不能有和此方法同名的方法)不能被繼承的類(lèi)稱(chēng)為最終類(lèi)。 如:final class Last; 用final說(shuō)明的成員方法為最終方法。 如:public final void printsuper( )測(cè)試類(lèi)的繼承關(guān)系在java中,類(lèi)一次只能繼承一個(gè)超類(lèi)使用“是一個(gè)(is a)短語(yǔ)驗(yàn)證繼承”例如:Person和Student繼承是正確的,因?yàn)橐粋€(gè)Student是一個(gè)Person,即Studen i

30、s a Person注:類(lèi)只有用public、final或缺省定義,如果用final定義的類(lèi)則不能被繼承。小節(jié)安排類(lèi)的封裝性、繼承性、多態(tài)性與接口4.1、封裝性4.2、繼承性4.3、多態(tài)性4.4、抽象類(lèi)4.5、接口4.6、內(nèi)部類(lèi)4.3 多態(tài)性多態(tài)性是指同一個(gè)名字的若干個(gè)方法,有不同的實(shí)現(xiàn)(即方法體中的代碼不一樣)。多態(tài)的兩種表現(xiàn)形式:(1) 同一類(lèi)中的方法多態(tài),稱(chēng)為方法重載overloading(靜態(tài)多態(tài)性):同一類(lèi)中允許多個(gè)同名方法,區(qū)分要點(diǎn):參數(shù)的個(gè)數(shù)不同,或者是參數(shù)類(lèi)型不同,或者是參數(shù)的順序不同(2) 子類(lèi)對(duì)父類(lèi)方法的重新定義,稱(chēng)為方法覆蓋overriding (動(dòng)態(tài)多態(tài)性) :方法名、

31、返回值和參數(shù)形態(tài)完全一樣。Java標(biāo)準(zhǔn)輸出方法的重載例:下面程序中第4行調(diào)用哪一行的show方法?public class Test public static void main(String argv) Test t = new Test(); t.show(1+3); public void show(int Val1,int Val2) System.out.println(Val1+Val2); public void show(int Val1) System.out.println(Val1); public void show(int Val1,int Val2,int Val

32、3) System.out.println(Val1+Val2+Val3); public class Test public static void main(String argv) Test t = new Test(); t.show(1+3); public void show(int Val1,int Val2) System.out.println(Val1+Val2); public void show(int Val1) System.out.println(Val1); public void show(int Val1,int Val2,int Val3) System.

33、out.println(Val1+Val2+Val3); 例:下面程序中第4行調(diào)用哪一行的show方法?方法重載的原則方法名相同。方法的參數(shù)類(lèi)型、個(gè)數(shù)、順序只要有一項(xiàng)不相同。返回類(lèi)型、修飾符可相同或不相同。 public int area(int r) public float area(int h,float r) public float area(float h,int r) 是正確的方法重載,而下面的則不是正確的方法重載: public int area(float h,float r) public float area(float h,float r)構(gòu)造方法也能重載小題目下述哪一

34、組方法,是一個(gè)類(lèi)中方法重載的正確寫(xiě)法? A) int addValue( int a, int b )return a+b; float addValue ( float a, float b) return a+b;B) int addValue (int a, int b )value=a+b; float addValue ( int a, int b) return (float)(a+b);C) int addValue( int a, int b )return a+1; int addValue ( int a, int b) return a+b;D) int addValue

35、( int a, int b ) return a+b; int addValue ( int x, int y ) return x+y;小題目下述哪一組方法,是一個(gè)類(lèi)中方法重載的正確寫(xiě)法? A) int addValue( int a, int b )return a+b; float addValue ( float a, float b) return a+b;B) int addValue (int a, int b )value=a+b; float addValue ( int a, int b) return (float)(a+b);C) int addValue( int

36、a, int b )return a+1; int addValue ( int a, int b) return a+b;D) int addValue( int a, int b ) return a+b; int addValue ( int x, int y ) return x+y;激活重載的構(gòu)造方法在一個(gè)構(gòu)造方法中可以利用另一個(gè)構(gòu)造方法。class Peopleprivate String name;private int age;public People(String n, int age)name = n ;this.age = age;public People( Stri

37、ng n) this(n,0); public People( ) this(“Unknown”); 一般地,重載的方法應(yīng)當(dāng)具有相似的行為(功能)public class ShapeArea public double area(float r) return Math.PI*r*r; public double area(float a,float b) return a*b; public double area(float a,float b,float c) float d; d=(a+b+c)/2; return Math.sqrt(d*(d-a)*(d-b)*(d-c); publ

38、ic static void main(String args) ShapeArea s=new ShapeArea(); System.out.println(The area of circle : +s.area(3); System.out.println(The area of rectangle : +s.area(7,4); System.out.println(The area of triangle : +s.area(3,4,5); 例:在類(lèi)ShapeArea中聲明三個(gè)同名方法area,求圓、矩形和三角形的面積方法的覆蓋(重寫(xiě))在子類(lèi)和超類(lèi)中有同名的方法(參數(shù)也相同),子類(lèi)

39、中的方法覆蓋超類(lèi)的方法。如果超類(lèi)和子類(lèi)有同名且參數(shù)相同的方法,那么超類(lèi)的對(duì)象調(diào)用超類(lèi)的方法,子類(lèi)的對(duì)象調(diào)用子類(lèi)的方法。通過(guò)覆蓋可以使同名的方法在不同層次的類(lèi)中有不同的實(shí)現(xiàn)注意:子類(lèi)中重寫(xiě)的方法和父類(lèi)中被重寫(xiě)的方法要具有相同的名字,相同的參數(shù)表和相同的返回類(lèi)型,只是函數(shù)體不同。方法覆蓋的原則(1)1、子類(lèi)方法的名稱(chēng)、參數(shù)簽名和返回類(lèi)型必須與其父類(lèi)的方法的名稱(chēng)、參數(shù)簽名和返回類(lèi)型一致public class Basepublic void method().public class Sub extends Basepublic void method(). public int method(in

40、t a) return 0; 方法覆蓋的原則(2)2、子類(lèi)方法不能縮小父類(lèi)方法的訪(fǎng)問(wèn)權(quán)限 public class Base public void method().public class Sub extends Base protected void method()./編譯錯(cuò)誤,子類(lèi)方法縮小了父類(lèi)方法的訪(fǎng)問(wèn)權(quán)限方法覆蓋的原則(3)3、子類(lèi)方法不能拋出比父類(lèi)方法更多的異常4、方法覆蓋只存在于子類(lèi)和父類(lèi)(包括直接父類(lèi)和間接父類(lèi))之間。在同一個(gè)類(lèi)中方法只能被重載,不能被覆蓋。5、父類(lèi)的靜態(tài)方法不能被子類(lèi)覆蓋為非靜態(tài)的方法,反之亦然;6、子類(lèi)可以定義與父類(lèi)的靜態(tài)方法同名的靜態(tài)方法,以便在子類(lèi)中

41、隱藏父類(lèi)的靜態(tài)方法。7、父類(lèi)的私有方法不能被覆蓋8、父類(lèi)的抽象方法可以被子類(lèi)覆蓋:子類(lèi)實(shí)現(xiàn)父類(lèi)的方法或重新聲明父類(lèi)的抽象方法。小題目public class TestDemo int m=5;public void some(int x) m=x; public static void main(String args ) new Demo().some(7);class Demo extends TestDemo int m=8;public void some(int x) super.some(x);System.out.println(m);A5 B8 C7 D無(wú)任何輸出 E編譯錯(cuò)誤

42、答案:CSystem.out.println(super.m);答案:B練習(xí):選擇題對(duì)于下列代碼: public class SupperClass public int sum( int a, int b) return a+b; class SubClass extends SupperClass 下述哪個(gè)方法可以加入類(lèi)SubClass? ( ) A) int sum ( int a, int b ) return a+b; B) public void sum (int a, int b ) return ; C) public float sum ( int a, int b) ret

43、urn a+b; D) public int sum ( int a, int b ) return a+b; E) public int sum ( float a, int b ) return a+b;答案:D、E小節(jié)安排類(lèi)的封裝性、繼承性、多態(tài)性與接口4.1、封裝性4.2、繼承性4.3、多態(tài)性4.4、抽象類(lèi)4.5、接口4.6、內(nèi)部類(lèi)4.4 抽象類(lèi)Abstract關(guān)鍵字:可修飾類(lèi)和方法,被修飾的類(lèi)稱(chēng)為抽象類(lèi),被修飾的方法稱(chēng)為抽象方法抽象類(lèi)是專(zhuān)門(mén)設(shè)計(jì)來(lái)讓子類(lèi)繼承的類(lèi)。抽象類(lèi)提供一個(gè)類(lèi)型的部分實(shí)現(xiàn),可以有實(shí)例變量,構(gòu)造方法,抽象方法和具體方法。一個(gè)抽象類(lèi)不會(huì)有實(shí)例。抽象方法是必須被子類(lèi)覆蓋的

44、方法。如果一個(gè)類(lèi)不具有抽象屬性,不能在該類(lèi)中定義抽象方法。抽象類(lèi)的作用抽象類(lèi)是表征我們對(duì)問(wèn)題領(lǐng)域進(jìn)行分析、設(shè)計(jì)中得出的抽象概念,是對(duì)一系列看上去不同,但是本質(zhì)上相同的具體概念的抽象。好比,我們都知道三角形是一個(gè)形狀,世界上有三角形這樣具體的東西,但是確沒(méi)有形狀這樣具體的東西,我們要描述這個(gè)形狀的概念就要用到抽象類(lèi)。因此在java中抽象類(lèi)是不允許被實(shí)例化的。在面向?qū)ο箢I(lǐng)域,抽象類(lèi)主要用來(lái)進(jìn)行類(lèi)型隱藏。那什么是類(lèi)型隱藏呢?我們可以構(gòu)造出一個(gè)固定的一組行為的抽象描述,但是這組行為卻能夠有任意個(gè)可能的具體實(shí)現(xiàn)方式。這個(gè)抽象描述就是抽象類(lèi),而這一組任意個(gè)可能的具體實(shí)現(xiàn)則表現(xiàn)為所有可能的派生類(lèi)。好比,動(dòng)物

45、是一個(gè)抽象類(lèi),人、猴子、老虎就是具體實(shí)現(xiàn)的派生類(lèi),我們就可以用動(dòng)物類(lèi)型來(lái)隱藏人、猴子和老虎的類(lèi)型。抽象類(lèi)的作用抽象類(lèi)通常代表一個(gè)抽象概念,可以用一句話(huà)來(lái)概括抽象類(lèi)的用途:抽象類(lèi)是用來(lái)繼承的。通過(guò)抽象類(lèi)使開(kāi)發(fā)的系統(tǒng)具有良好的擴(kuò)展性和可復(fù)用性 聲明抽象類(lèi)和方法格式abstract class 成員變量; 方法() 方法體 ; /定義一般方法 abstract 方法( ); /定義抽象方法 抽象方法不用實(shí)現(xiàn)代碼,而是在子類(lèi)中實(shí)現(xiàn)所有的抽象方法。對(duì)于成員方法,不能同時(shí)用static和abstract說(shuō)明。對(duì)于類(lèi),不能同時(shí)用final和abstract說(shuō)明。抽象類(lèi)抽象類(lèi)也可有普通的成員變量或方法。抽象類(lèi)

46、可以有構(gòu)造方法,但不能直接用來(lái)生成實(shí)例。一般可通過(guò)定義子類(lèi)進(jìn)行實(shí)例化??梢陨沙橄箢?lèi)的變量,該變量可以指向具體的一個(gè)子類(lèi)的實(shí)例。 abstract class Employee abstract void raiseSalary(int i) ; class Manager extends Employee void raiseSalary(int i ) . Employee e = new Manager( ) ;abstract class Shapeabstract protected double area();abstract protected void draw();class

47、 Rectangle extends Shapefloat width,length;Rectangle(float w,float l)width=w;length=l;public double area() return width*length; public void draw();public class ShapeDemopublic static void main(String args)Rectangle r=new Rectangle(6,12);System.out.println(The area of rectangle:+r.area();例:抽象類(lèi)的例子必須覆蓋

48、父類(lèi)的abstract方法練習(xí):以下程序的編譯和運(yùn)行結(jié)果為? abstract class Base abstract public void myfunc(); public void another() System.out.println(Another method); public class Abs extends Base public static void main(String args ) Abs a = new Abs(); a.amethod(); public void myfunc() System.out.println(My Func); public voi

49、d amethod() myfunc(); A 輸出結(jié)果為 My FuncB 編譯指示 Base 類(lèi)中無(wú)抽象方法C 編譯通過(guò)但運(yùn)行時(shí)指示Base 類(lèi)中無(wú)抽象方法D 編譯指示Base 類(lèi)中的myfunc方法無(wú)方法體答案:A小節(jié)安排類(lèi)的封裝性、繼承性、多態(tài)性與接口4.1、封裝性4.2、繼承性4.3、多態(tài)性4.4、抽象類(lèi)4.5、接口4.6、內(nèi)部類(lèi)4.5 接口接口是在程序開(kāi)發(fā)的早期建立一組協(xié)議(規(guī)范公共的操作接口)而不具體實(shí)現(xiàn),便于設(shè)計(jì)更合理的類(lèi)層次,代碼更靈活在Java中,一個(gè)類(lèi)只能有一個(gè)超類(lèi)。但Java提供了接口用于實(shí)現(xiàn)多重繼承,一個(gè)類(lèi)可以有一個(gè)超類(lèi)和多個(gè)接口。接口(interface)是一個(gè)特殊

50、的類(lèi):由常量和抽象方法組成。 接口的定義public interface 接口名 extends 父接口名列表 /常量聲明 常量的數(shù)據(jù)類(lèi)型 常量標(biāo)識(shí)符 = 常量值 ; /抽象方法聲明 返回類(lèi)型 方法名(參數(shù)列表) throw 異常列表; 接口只包括常量定義和抽象方法。接口具有繼承性,一個(gè)接口還可以繼承多個(gè)父接口,父接口間用逗號(hào)分隔。 系統(tǒng)默認(rèn),接口中所有屬性的修飾都是 public static final,也就是靜態(tài)常量。 系統(tǒng)默認(rèn),接口中所有方法的修飾都是 public abstract。接口定義的形式1接口中聲明的變量全部為final和static類(lèi)型的,并且這個(gè)接口的作用在于定義一些值

51、不能改變的變量。舉個(gè)例子:publicinterfaceObjectConstants publicstaticfinalStringSPACE=newString(); publicstaticfinalcharFORMAT=t;接口定義的形式2接口中只定義可供實(shí)現(xiàn)的抽象方法 publicinterfaceFlyer publicvoidtakeoff(); publicvoidland(); publicvoidfly();接口定義的形式3接口中既聲明變量,又定義可供實(shí)現(xiàn)的抽象方法。如非必要,一般會(huì)將這樣一個(gè)接口定義拆分成兩個(gè)接口定義接口的實(shí)現(xiàn)(implements) 接口定義了一套行為規(guī)

52、范,一個(gè)類(lèi)實(shí)現(xiàn)這個(gè)接口就要遵守接口中定義的規(guī)范,實(shí)際上就是要實(shí)現(xiàn)接口中定義的所有方法。接口實(shí)現(xiàn)的格式:class implements 接口名1,接口名2,一個(gè)接口可以被一個(gè)或多個(gè)類(lèi)實(shí)現(xiàn)。當(dāng)一個(gè)類(lèi)實(shí)現(xiàn)了一個(gè)接口,它必須實(shí)現(xiàn)接口中所有的方法,這些方法都要被說(shuō)明為public,否則會(huì)產(chǎn)生訪(fǎng)問(wèn)權(quán)限錯(cuò)誤。例:接口的實(shí)現(xiàn)用面向?qū)ο蟮乃枷攵x一個(gè)接口A(yíng)rea,其中包含一個(gè)計(jì)算面積的方法CalsulateArea();設(shè)計(jì)MyCircle和MyRectangle兩個(gè)類(lèi)都實(shí)現(xiàn)這個(gè)接口中的方法CalsulateArea(),分別計(jì)算圓和矩形的面積寫(xiě)出測(cè)試以上類(lèi)和方法的程序TestArea.java。注:圓周率:

53、Math.PI interface Areapublic double CalsulateArea();class MyCircle implements Areadouble r;public MyCircle(double r)this.r=r;public double CalsulateArea()return Math.PI*r*r;class MyRectangle implements Areadouble width,height;public MyRectangle(double w,double h)width=w;height=h;public double Calsul

54、ateArea()return width*height;class TestArea public static void main(String args) MyCircle c=new MyCircle(2.0); System.out.println(圓的面積:+c.CalsulateArea(); MyRectangle r=new MyRectangle(2.0,3.0); System.out.println(矩形的面積:+r.CalsulateArea(); 接口和抽象類(lèi)的區(qū)別接口可以多重繼承,抽象類(lèi)不可以抽象類(lèi)內(nèi)部可以有實(shí)現(xiàn)的方法,接口則沒(méi)有實(shí)現(xiàn)的方法接口與實(shí)現(xiàn)它的類(lèi)不構(gòu)成類(lèi)

55、的繼承體系,即接口不是類(lèi)體系的一部分。因此,不相關(guān)的類(lèi)也可以實(shí)現(xiàn)相同的接口。而抽象類(lèi)是屬于一個(gè)類(lèi)的繼承體系,并且一般位于類(lèi)體系的頂層。接口的優(yōu)勢(shì):通過(guò)實(shí)現(xiàn)多個(gè)接口實(shí)現(xiàn)多重繼承,能夠抽象出不相關(guān)類(lèi)之間的相似性。創(chuàng)建類(lèi)體系的基類(lèi)時(shí),若不定義任何變量并無(wú)需給出任何方法的完整定義,則定義為接口;必須使用方法定義或變量時(shí),考慮用抽象類(lèi)。 小題目下列關(guān)于接口和抽象類(lèi)的說(shuō)法不正確的是?( ) A) 接口也有構(gòu)造方法B) 實(shí)現(xiàn)接口時(shí),需對(duì)接口中的所有方法都要實(shí)現(xiàn)C) 抽象類(lèi)也有構(gòu)造方法 D) 抽象類(lèi)可以派生出子類(lèi)A以下是接口I的定義:interface Ivoid setValue(int val);int

56、getValue();以下哪段代碼能通過(guò)編譯?A、 class A extends I int value; void setValue(int val)value=val; int getValue()return value; B、 class B implements I int value; void setValue(int val)value=val; C、 interface C extends I void increment( ); D、 interface D implements I void increment(); 小題目接口的實(shí)現(xiàn)(implements) 接口里面的

57、所有屬性都為public static final的,即使你不寫(xiě)出來(lái),也會(huì)被默認(rèn)為這樣的,接口里面的方法是且只能是public,就算你在接口里不寫(xiě),那也是默認(rèn)的public的,但在用類(lèi)實(shí)現(xiàn)接口的時(shí)候,必須將方法寫(xiě)為public的,不能不寫(xiě),應(yīng)為不寫(xiě)會(huì)被默認(rèn)為是default的,這樣權(quán)限就發(fā)生變化了,就會(huì)出錯(cuò)。小節(jié)安排類(lèi)的封裝性、繼承性、多態(tài)性與接口4.1、封裝性4.2、繼承性4.3、多態(tài)性4.4、抽象類(lèi)4.5、接口4.6、內(nèi)部類(lèi)4.6內(nèi)部類(lèi)內(nèi)部類(lèi)的類(lèi)名只用于定義它的類(lèi)或語(yǔ)句塊之內(nèi),在外部引用它時(shí)必須給出帶有外部類(lèi)名的完整名稱(chēng),并且內(nèi)部類(lèi)的名字不允許與外部包類(lèi)的名字相同。內(nèi)部類(lèi)可以是抽象類(lèi)或接口

58、,若是接口,則可以由其它內(nèi)部類(lèi)實(shí)現(xiàn)按照內(nèi)部類(lèi)是否含有顯示的類(lèi)名,可將內(nèi)部類(lèi)分為:實(shí)名內(nèi)部類(lèi)匿名內(nèi)部類(lèi)1、實(shí)名內(nèi)部類(lèi)格式:類(lèi)修飾詞表 class 類(lèi)名 extends 父類(lèi)名 implements 接口名列表 類(lèi)體實(shí)名內(nèi)部類(lèi)的封裝性增加了保護(hù)模式和私有模式,即實(shí)名內(nèi)部類(lèi)的修飾詞可以是protected或private實(shí)名內(nèi)部類(lèi)的修飾詞可以是static,稱(chēng)為靜態(tài)實(shí)名內(nèi)部類(lèi)沒(méi)有static修飾的內(nèi)部類(lèi),稱(chēng)為不具有靜態(tài)屬性的實(shí)名內(nèi)部類(lèi),它的成員域若有靜態(tài)屬性,則必須有final屬性,但不能有靜態(tài)屬性的方法創(chuàng)建實(shí)名內(nèi)部類(lèi)創(chuàng)建靜態(tài)實(shí)名內(nèi)部類(lèi)格式: new 外部類(lèi)名.實(shí)名內(nèi)部類(lèi)名(構(gòu)造方法調(diào)用參數(shù)列表)創(chuàng)

59、建不具有靜態(tài)屬性的實(shí)名內(nèi)部類(lèi)格式: 外部類(lèi)表達(dá)式.new 實(shí)名內(nèi)部類(lèi)名(構(gòu)造方法調(diào)用參數(shù)列表)創(chuàng)建實(shí)名內(nèi)部類(lèi)public class J_Outer static class J_Inner1 final static double PI=3.1415; double Area(double r) return PI*r*r; class J_Inner2 final static String FORMAT=“0-90-5”; double Area(double w,double h) return w*h; public static void main(String args) J_O

60、uter.J_Inner1 c1=new J_Outer.J_Inner1();/J_Inner1是static J_Outer o=new J_Outer(); J_Outer.J_Inner2 c2= o. new J_Inner2();/J_Inner2是非static 訪(fǎng)問(wèn)實(shí)名內(nèi)部類(lèi)成員或方法訪(fǎng)問(wèn)靜態(tài)實(shí)名內(nèi)部類(lèi)的靜態(tài)成員域格式: 外部類(lèi)名.實(shí)名內(nèi)部類(lèi)名.靜態(tài)成員域名或方法 System.out.println(J_Outer.J_Inner1.PI);訪(fǎng)問(wèn)靜態(tài)實(shí)名內(nèi)部類(lèi)的不具有靜態(tài)屬性的成員域格式: 表達(dá)式.成員域名或方法 J_Outer.J_Inner1 c11=new J_Oute

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論