




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
java類和對象設計java類和對象設計java類和對象設計2主要內容4.1面向對象的基本概念4.2定義Java類4.3Java對象4.4Java包4.5Java的面向對象特性4.6抽象類4.7接口java類和對象設計java類和對象設計java類和對象設計1主要內容4.1面向對象的基本概念4.2定義Java類4.3Java對象4.4Java包4.5Java的面向對象特性4.6抽象類4.7接口2主要內容4.1面向對象的基本概念24.1面向過程與面向對象面向過程程序設計:C語言分析出解決問題所需步驟(過程),然后用函數把這些步驟一步一步實現,使用時一個一個依次調用。程序的數據與操作(函數)分離,導致難以擴展,維護困難代碼重用性低34.1面向過程與面向對象面向過程程序設計:C語言34.1面向對象的基本概念面向對象程序設計:Java/C#思想:功能來劃分問題,抽象事物為對象,以人類思維模擬現實中的客觀事物數據(屬性)與數據操作(方法)作封裝在一起維護方便,軟件重用效率高(操作對象)44.1面向對象的基本概念面向對象程序設計:Java/C#
我要去新疆面向過程我開動車,掛擋,踩油門,過江西、湖南、四川、青海到新疆面向對象
我命令車去新疆車怎么去我不用關信息封裝在車這個類的內部,使用者無需了解4.1面向對象的基本概念5我要去新疆4.1面向對象的基本概念54.1面向對象的基本概念類與對象消息和方法面向對象特征:封裝性,繼承性、多態性64.1面向對象的基本概念類與對象6類與對象類:一種復合數據類型,是將不同類型的數據和與這些數據相關的操作封裝在一起的封裝體。對象:類的一個實例;1.類是某一類具有相似屬性和方法對象的抽象;而對象是某一種類的實例。2.類和對象可理解為數據類型與值的關系7類與對象類:一種復合數據類型,是將不同類型的數據和與這些數據方法,消息變量:即指對象所知道的狀態(屬性)方法:指對象的功能單元(操作)。軟件對象通過相互間傳遞消息來相互作用和通信消息由三部分組成:1.接受消息的對象2.要完成方法的名字3.方法需要的參數對象B對象Amessage8方法,消息變量:即指對象所知道的狀態(屬性)對象B對象Am封裝什么是封裝?一種將操作和涉及的數據捆綁在一起從而避免外部干擾或誤用的機制Java中最基本的封裝單元是類封裝實際上使用方法將類的數據隱藏起來,控制用戶對類的修改和訪問數據的程度。私有數據方法方法數據對象A對象B公有數據9封裝什么是封裝?封裝實際上使用方法將類的數據隱藏起來,控制用繼承什么是繼承?繼承是子類獲取父類中定義的方法和變量,就像它們屬于子類本身一樣,另可新增變量、方法classPerson{Stringname;intage;intsex;
sleep(){…}}
classTrash_CarextendsCar{intstu_no;goSchool(){…}}10繼承什么是繼承?classPersonclassTras何時選擇繼承性一個很好的經驗:“C是一個A嗎?”如果是則讓C做A的子類.常犯的錯誤A有一個C嗎?例如讓汽車輪子成為汽車的子類是錯誤的在父類中只定義各子類共同需要的屬性和方法,派生類時,由子類自己增加新的屬性和方法。11何時選擇繼承性一個很好的經驗:“C是一個A嗎?”常犯的錯誤多態什么是多態?多態性是指同名的方法可以有多種不同的功能,或者相同的接口有多種實現方法.12多態什么是多態?12主要內容4.1面向對象的基本概念4.2定義Java類4.3Java對象4.4Java包4.5Java的面向對象特性4.6抽象類4.7接口13主要內容4.1面向對象的基本概念134.2定義Java類包括類聲明和類體類聲明:
[public][abstract|final]classclassName[extendssuperclassName][implementsinterfaceNameList]{……}144.2定義Java類包括類聲明和類體14Java類體class類名{//類名一般首字母大寫
[修飾符]類型變量名;//成員變量
[修飾符]返回類型方法名([參數列表])//一般小寫
{語句}//成員方法體
}常用修飾符:[public|protected|private][static][final][transient][volatile]15Java類體class類名{//類名一般初探類與對象classCircle{floatx,y;floatr;doublegetArea(){returnr*r*3.14;}doublegetCircumference(){return2*r*3.14;}publicstaticvoidmain(String[]args){Circlec=newCircle();//創建類的對象cc.r=3;c.x=0;c.y=0;//為對象c的成員變量賦值
System.out.println(“Area”+c.getArea());//訪問成員方法
System.out.println(“Circumference”+c.getCircumference());}}16初探類與對象classCircle{16成員變量[修飾符]基本類型變量名;//成員變量類型:簡單類型(int、float)、數組、類(如String)成員變量定義在所有成員方法外,作用域是整個類類中的所有方法可直接訪問成員變量使用方法:對象名.成員變量classStudent{intno;Stringname;Birthdayday;}classBirthday{intyear;intmonth;intday;}17成員變量[修飾符]基本類型變量名;成員方法返回值類型方法名([參數列表]){//方法體
}返回值類型可為基本類型或類,無返回值時需為void參數列表可有若干個參數,用逗號隔開
返回值須與返回類型一致,或是其子類使用方法:對象名.成員方法(參數)classRectangle{doublelength;doublewidth;doublearea(){returnlength*width;}voidsetDim(doublew,doublel){width=w;length=l;}}18成員方法返回值類型方法名([參數列表])classRe成員方法(方法體)方法體包括局部變量的聲明以及所有合法的Java指令。局部變量的作用域在該方法內部。若局部變量與類的成員變量同名,則類的成員變量被隱藏。this——用在一個方法中引用當前對象,它的值是該方法所在的對象。19成員方法(方法體)方法體包括局部變量的聲明以及所有合法的Ja成員方法(方法體)實例(1)classVariable{intx=0,y=0,z=0;//類的成員變量
voidinit(intx,inty){this.x=x;this.y=y;intz=5;//局部變量,隱藏全局變量
System.out.println(“**ininit**”);System.out.println(“x=”+x+“y=”+y+“z=”+z)}}20成員方法(方法體)實例(1)classVariable{2成員方法(方法體)實例(2)publicclassVariableTest{publicstaticvoidmain(Stringargs[]){Variablev=newVariable();System.out.println(“**beforeinit**”);System.out.println(“x=”+v.x+“y=”+v.y+“z=”+v.z);v.init(20,30);System.out.println(“**afterinit**”);System.out.println(“x=”+v.x+“y=”+v.y+“z=”+v.z);}}21成員方法(方法體)實例(2)publicclassVar成員方法(方法體)實例(3)運行結果
c:\>javaVariableTest**beforeinit**x=0y=0z=0**ininit**x=20y=30z=5**afterinit**x=20y=30z=022成員方法(方法體)實例(3)運行結果22方法重載(MethodOverloading)方法重載指多個方法享有相同的方法名區別在于:參數類型不同,或個數不同;返回類型不能用來區分重載的方法。23方法重載(MethodOverloading)方法重載指多方法重載publicclassOverLoad{ inti=3,j=4; intsum(){ returni+j; } intsum(inta,intb){ returna+b; } intsum(inta,intb,intc){ returna+b+c; } doublesum(doublea,doubleb){ returna+b; } publicstaticvoidmain(String[]args){ OverLoado=newOverLoad(); System.out.println(o.sum()); System.out.println(o.sum(5,6)); System.out.println(o.sum(5,8,4)); System.out.println(o.sum(3.2,2.15)); }}24方法重載publicclassOverLoad{24實例化對象類是一種抽象的復合數據類型,只有實例化生成對象后才能使用。格式:類名對象名=new類名([參數列表]);
Studentstu1=newStudent(“Bin”,20);Studentstu2=newStudent(“Tom”,21);new為每個對象分配不同內存空間,并返回該對象的引用(即對象在內存中首地址);改變對象互不影響。stu1==stu2等價于stuq.equlas(stu2)判斷兩對象是否地址相等結果是false只聲明類的實例,不創建對象可用nullStudentstu=null;//未分配內存空間
stu=newStudent();25實例化對象類是一種抽象的復合數據類型,只有實例化生成對象后才初始化對象方式一:定義成員變量時直接賦初值
calssStudent{Stringname=“zhangshan”;}方式二------使用構造方法26初始化對象方式一:定義成員變量時直接賦初值26構造方法定義:
①方法名與類名相同;②不返回任何數據類型(void也不能有)用法:構造方法只能由new運算符調用作用:利用構造方法進行初始化注意:構造方法不能被繼承;重載經常用于構造方法27構造方法定義:27構造方法示例classPoint{intx,y;Point(){x=0;y=0;}Point(intx,inty){this.x=x;this.y=y;}}完整例子28構造方法示例28成員方法(值參傳遞)publicclassPassTest{floatptValue;publicstaticvoidmain(Stringargs[]){intval;PassTestpt=newPassTest();val=11;System.out.println(“OriginalIntValueis:”+val);pt.changedInt(val);System.out.pringln(“IntValueafterChangeis:”+val);pt.ptValue=101f;System.out.println(“OriginalptValueis:”+pt.ptValue);pt.ChangeObjValue(pt);System.out.println(“ptValueafterChangeis:”+pt.ptValue);}29成員方法(值參傳遞)publicclassPassTes成員方法(值參傳遞)publicvoidchangeInt(intvalue){value=55;}publicvoidchangeObjValue(PassTestref){ref.ptValue=99f;}30成員方法(值參傳遞)publicvoidchangeIn成員方法(值參傳遞)運行結果c:\>javaPassTestOriginalIntValueis:11IntValueafterChangeis:11OriginalptValueis:101.0ptValueafterChangeis:99.031成員方法(值參傳遞)運行結果31主方法與命令行參數publicstaticvoidmain(String[]args)該方法被定義為publicstaticvoid也就是公開的靜態的無返回值的方法,且參數args為一個字符串數組,用來接收從命令行輸入的參數。參數之間使用空格隔開。Java解釋器會自動處理,把用空格隔開的各個參數通過args數組傳遞給main方法。參數的下標從0開始,args[0]表示傳入的第一個參數,args[1]表示傳入的第二個參數,以此類推。32主方法與命令行參數publicstaticvoidmaExample:public
class
TestJava
{
public
static
void
main(String[]
args)
{
for
(int
i=0;
args
!=
null
&&
i<args.length;
i++)
{
System.out.println("第"
+
i
+
"個參數:"
+
args[i]);
}
}
}
c:\>Java\javaTestJavathisisaparametertest
第0個參數:this
第1個參數:is
第2個參數:a
第3個參數:parameter
第4個參數:test33Example:public
class
TestJava
finalize()方法在父類java.lang.Object中實現對對象進行垃圾收集前,系統自動調用自己重寫時需要調用父類的finalize()方法該方法最常見的作用是確保釋放實例占用的全部資源。protectedvoidfinalize()throwsthrowable{……//本類的資源清除代碼
super.finalize();}34finalize()方法在父類java.lang.Objec主要內容4.1面向對象的基本概念4.2定義Java類4.3Java對象4.4Java包4.5Java的面向對象特性4.6抽象類4.7接口35主要內容4.1面向對象的基本概念354.3Java對象一旦定義了所需的類,就可以創建該類的變量,創建類的變量稱為類的實例化,類的變量也稱為類對象、類的實例等。對象通過消息傳遞來進行交互消息傳遞即激活指定的某個對象的方法以改變其狀態或讓它產生一定的行為。364.3Java對象一旦定義了所需的類,就可以創建該類的變量對象的生命周期對象是在程序運行中創建生成的,其所占的空間在程序運行中動態分配。當一個類的對象完成了它的使命,為節省資源,Java的垃圾收集程序就會自動收回這個對象所占的空間。即類對象有自己的生命周期。生成使用清除37對象的生命周期對象是在程序運行中創建生成的,其所占的空間在程對象的生成包括聲明、實例化和初始化
TypeobjectName=newtype([paramlist]);(1)聲明:TypeobjectName聲明并不為對象分配內存空間,而只是分配一個引用空間;(2)實例化:運算符new為對象分配內存空間,它調用對象的構造方法,返回引用;一個類的不同對象分別占據不同的內存空間。(3)生成:自動執行構造方法,進行初始化;根據參數不同調用相應的構造方法。38對象的生成包括聲明、實例化和初始化38對象的使用對象的引用指向一個中間的數據結構,它存儲有關數據類型的信息以及當前對象所在的堆的地址,而對于對象所在的實際的內存地址是不可操作的,這就保證了安全性。通過運算符“.”可以實現對變量的訪問和方法的調用。39對象的使用對象的引用指向一個中間的數據結構,它存儲有關數據類調用對象的變量格式:objectReference.variableobjectReference是一個已生成的對象,也可以是能生成對象的表達式例:
Rectangler=newRectangle();r.length=10;
r.width=12;40調用對象的變量格式:objectReference.vari調用對象的方法格式:objectReference.methodName([paramlist]);classRectDemo2{publicstaticvoidmain(Stringargs[]){Rectanglerect1=newRectangle();Rectanglerect2=newRectangle();doublear;rect1.setDim(20,10);//初始化每個長方形
rect2.setDim(6,3);ar=rect1.area();System.out.println("第一個長方形的面積是:"+ar);ar=rect2.area();System.out.println("第二個長方形的面積是:"+ar);}}41調用對象的方法格式:objectReference.meth實例成員和類成員實例成員為特定實例所有,通過對象名訪問;類成員為類所有,不屬于某一個對象,可以通過類名訪問。類成員的格式(static):statictypeclassVar;staticreturnTypeclassMethod({paramlist]){…}42實例成員和類成員實例成員為特定實例所有,通過對象名訪問;類成實例變量和類變量每個對象的實例變量都分配內存通過對象來訪問這些實例變量類變量僅在生成第一個對象時分配內存,所有實例對象共享同一個類變量。類變量可通過類名直接訪問,無需先生成一個實例對象也可以通過實例對象訪問類變量43實例變量和類變量每個對象的實例變量都分配內存43實例變量和類變量classABCD{chardata;staticint_share_data;}classDemo{ABCDa,b,c,d;}objectbchardataobjectcchardataObjectbchardatastaticintshare_dataobjectbchardata44實例變量和類變量classABCDobjectbobje實例方法和類方法類(static)方法不能訪問實例變量,只能訪問類變量類方法可以由類名直接調用類方法中不能使用this或super45實例方法和類方法類(static)方法不能訪問實例變量,只能實例方法和類方法classmember{staticintclassVar;intinstanceVar;staticvoidsetClassVar(inti){classVar=i;//instanceVar=i;//can’taccessnostaticmember}staticintgetClassVar(){returnclassVar;}voidsetInstanceVar(inti){classVar=i;instanceVar=i;}intgetInstanceVar(){returninstanceVar;}46實例方法和類方法classmember{46實例方法和類方法public
classtest{
public
static
voidmain(Stringargs[]){memberm1=newmember();memberm2=newmember();m1.setClassVar(1);m2.setClassVar(2);System.out.println("m1.classVar="+m1.getClassVar()+"m2.ClassVar="+m2.getClassVar());m1.setInstanceVar(11);m2.setInstanceVar(22);System.out.println("m1.InstanceVar="+m1.getInstanceVar()+"m2.InstanceVar="+m2.getInstanceVar());}}
47實例方法和類方法publicclasstest{47實例方法和類方法運行結果c:\>javamemberTestm1.classVar=2m2.classVar=2m1.InstanceVar=11m2.InstanceVar=2248實例方法和類方法運行結果48對象的清除對象的清除是指釋放對象占用的內存空間。使用new操作符創建對象之后,Java虛擬機自動為該對象分配內存并保持跟蹤。Java虛擬機能判斷出對象是否還被引用,對不再被引用的對象,釋放它所占用的內存。我們也可以自行標明一個對象不在使用,只要把一個空值null賦給這個對象引用即可:Obj=null;49對象的清除對象的清除是指釋放對象占用的內存空間。49主要內容4.1面向對象的基本概念4.2定義Java類4.3Java對象4.4Java包4.5Java的面向對象特性4.6抽象類4.7接口50主要內容4.1面向對象的基本概念504.4Java包(package)一組相關的類和接口集合稱為包,包體現了Java語言面向對象特性中的封裝機制。包將java語言的類和接口有機地組織成層次結構,這個層次結構與具體的文件系統的目錄樹結構層次一致。514.4Java包(package)一組相關的類和接口集合稱
包由語句package創建,其語法格式如下:
package[包名1[.包名2[.[...]]]]Java中,package語句必須是程序的第一條非空格、非注釋語句。通過package語句,可將Java程序分層次地存放在不同的目錄下,目錄名稱與包的名稱相同。
packagebook.ch05;classRect{
將類Rect放在當前目錄的子目錄book/ch05下創建包52包由語句package創建,其語法格式如下:創建包52Java中,若要用到某些包中的類或接口,一種方法是在程序的開始部分寫出相應的引入(import)語句,指出要引入哪些包的哪些類。另一種方法不用引入語句,直接在要引入的類和接口前給出其所在包名。無論采用哪種方法,使用系統類的前提是這個系統類應該是用戶程序可見的類。使用包53Java中,若要用到某些包中的類或接口,一種方法是在程序的開1.使用import語句用于靈活地實現在編譯中使用外部類和接口的引入機制。
import包名;
import包名.標識符;
import包名.*;2.直接使用包一般用在程序中引用類和接口次數較少的時候,在要引入的類和接口前直接給出其所在包名。
java.applet.Appletap=newjava.applet.Applet();使用包541.使用import語句使用包54包的使用示例package
DF;
public
class
Person
{
private
String
name;
public
Person(String
name)
{
=
name;
}
public
String
getName()
{
return
name;
}
}
55包的使用示例package
DF;
public
class包的使用示例import
DF.Person;
public
class
Hello
{
public
static
void
main(String[]
args)
{
Person
person
=
new
Person("Mike");
System.out.println(person.getName());
}
}56包的使用示例import
DF.Person;
publi主要內容4.1面向對象的基本概念4.2定義Java類4.3Java對象4.4Java包4.5Java的面向對象特性4.6抽象類4.7接口57主要內容4.1面向對象的基本概念574.5面向對象特性封裝性繼承性多態性584.5面向對象特性封裝性58封裝性類定義[public][abstract|final]classclassName{[public|protected|private][static][final]typevariableName;//成員變量
[public|protected|private][static][final|abstract]returnTypemethodName([paramList])[throwsexceptionList]{statements}//成員方法
}59封裝性類定義59封裝性-類的修飾abstract類不能直接產生屬于這個類的對象final類不能被其他任何類所繼承(安全的考慮)public類不但可以被同一程序包中的其它類使用,別的程序包中的類也可以使用.缺省:類只能被本包中的其它類使用(即便import也不行)60封裝性-類的修飾abstract類不能直接產生屬于這個類的對封裝性-java訪問控制變量和方法的修飾字public、protected、privatepublic:任何其它類、對象只要可以看到這個類的話,那么它就可以存取變量的數據,或使用方法。classABC{publicintpub_i=5;
publicvoidshow)(){System.out.println(“pub_i”+pub_i);}61封裝性-java訪問控制變量和方法的修飾字public、pr封裝性-例子classDemo{publicstaticvoidmain(Stringargs[]){ABCabc=newABC();System.out.println(“abc.pub_i”+abc.pub_i);abc.pub_i=10;abc.show();}}abc.pub_i=5pub_i=10;62封裝性-例子classDemoabc.pub_i=562封裝性-protected如果一個類中變量或方法有修飾字protected,同一類,同一包可以使用。不同包的類要使用,必須是該類的子類可以存取變量或調用publicclassABC{protectedintpro_i=5;protectedvoidshow(){System.out.println(“pro_i=”+pro_i;)}}
63封裝性-protected如果一個類中變量或方法有修飾字pr封裝性-protected同一個包中的類能使用classDEF{publicstaticvoidmain(Stringargs[]){ABCabc=newABC();System.out.println(“_i=“+_i);abc.pub_i=10;abc.show();}}64封裝性-protected同一個包中的類能使用classDimportmytest.pack.ABC;classDEFextendsABC{publicstaticvoidmain(Stringagrs[]){DEFdef=newDEF();System.out.println(_i);_i=10;def.show();}}封裝性-protected不同包但是是子類也可以65importmytest.pack.ABC;封裝性-pro封裝性private不允許任何其他類存取和調用“前邊無修飾字的情況”,稱為缺省控制,也稱包權限在同一包中出現的類才可以直接使用它的數據和方法.66封裝性private66封裝性-修飾符與訪問控制同一個類同一個包不同包的子類不同包非子類private√空白√√protected√√√public√√√√67封裝性-修飾符與訪問控制同一個類同一個包不同包的子類不同包非final關鍵字(1)final修飾變量,則成為常量finaltypevariableName;修飾成員變量時,定義時同時給出初始值,而修飾局部變量時不做要求。(2)final修飾方法,則該方法不能被子類重寫finalreturnTypemethodName(paramList){…}68final關鍵字(1)final修飾變量,則成為常量68final關鍵字(3)final修飾類,則類不能被繼承finalclassfinalClassName{…}69final關鍵字(3)final修飾類,則類不能被繼承69繼承性通過繼承實現代碼復用父類包括直接或者間接被繼承的類Java不支持多重繼承,但繼承具有傳遞性子類不能訪問父類中訪問權限為private的成員變量和方法。子類可以重寫父類的方法,及命名與父類同名的成員變量70繼承性通過繼承實現代碼復用70創建子類格式:classSubClassextendsSuperClass{…}71創建子類格式:71繼承性示例72繼承性示例72繼承性示例73繼承性示例73繼承性示例74繼承性示例74繼承性示例classA{inti,j;voidshowij(){System.out.println("iandj:"+i+""+j);}}//創建一個繼承超類A的子類BclassBextendsA{intk;voidshowk(){System.out.println("k:"+k);}voidsum(){System.out.println("i+j+k:"+(i+j+k));}}75繼承性示例classA{75繼承性示例classSimpleInheritance{publicstaticvoidmain(Stringargs[]){AsuperOb=newA();BsubOb=newB();superOb.i=10;superOb.j=20;System.out.println("ContentsofsuperOb:");superOb.showij();System.out.println();subOb.i=7;subOb.j=8;subOb.k=9;System.out.println("ContentsofsubOb:");subOb.showij();subOb.showk();System.out.println();System.out.println("Sumofi,jandkinsubOb:");subOb.sum();}}ContentsofsuperOb:iandj:1020ContentsofsubOb:iandj:78k:9Sumofi,jandkinsubOb:i+j+k:2476繼承性示例classSimpleInheritance{構造方法在繼承中的使用
構造方法不能繼承如父類中只有默認的無參構造方法,寫子類的構造方法時不需要用super來初始化父類,它會自動調用父類的默認構造函數。當父類重寫了構造函數后,父類默認的構造函數就被屏蔽,此時在子類寫構造函數時必須調用父類的某個(當父類有多個構造函數時)77構造方法在繼承中的使用
構造方法不能繼承77構造方法在繼承中的使用示例classA{A(){System.out.println("InsideA'sconstructor.");}}classBextendsA{//創建A的以個子類.B(){System.out.println("InsideB'sconstructor.");}}classCextendsB{//創建另一個子類繼承B.C(){System.out.println("InsideC'sconstructor.");}}classCallingCons{publicstaticvoidmain(Stringargs[]){Cc=newC();}}程序運行結果:InsideA'sconstructor.InsideB'sconstructor.InsideC'sconstructor.78構造方法在繼承中的使用示例classA{程序運行結果:7classBooks{Stringname;Books(Stringna){
=na;}}classBookextendsBooks{Stringauthor;Book(Stringauthor){
super(“john”);//如果沒有這句,編譯出錯
this.author=author;//局部變量和成員變量同名時,this用于表示當前對象
}}構造方法在繼承中的使用示例79classBooks{構造方法在繼承中的使用示例79public
classtest{
public
static
voidmain(Stringargs[]){Bookb=newBook("mike");System.out.println("name="+);System.out.println("author="+b.author);}}構造方法在繼承中的使用示例運行結果:name=johnauthor=mike80publicclasstest{構造方法在繼承中的使用示方法重寫(overridden)子類中重寫的方法和父類中被重寫的方法要具有相同的名字,相同的參數表和相同的返回類型81方法重寫(overridden)子類中重寫的方法和父類中被重方法重寫示例82方法重寫示例82成員變量的隱藏和方法的重寫classSuperClass{intx;…voidsetX(){x=0;}…}classSubClassextendsSuperClass{intx;//hidexinSuperClass…voidsetX(){//overridemethodsetX()x=5;}….}83成員變量的隱藏和方法的重寫classSuperClass{Super(1)super用來引用當前對象的父類(1)訪問父類被隱藏的成員變量,如:super.variable;(2)調用父類中被重寫的方法,如:super.Method([paramlist]);(3)調用父類的構造函數,如:super([paramlist]);84Super(1)super用來引用當前對象的父類84Super(2)classSuperClass{intx;SuperClass(){x=3;System.out.println(“inSuperClass:x=“+x);}voiddoSomething(){System.out.println(“inSuperClass.doSomething()”);}}85Super(2)classSuperClass{85Super(3)classSubClassextendsSuperClass{intx;SubClass(){super();//callconstructorofsuperclassx=5;//super()要放在方法中的第一句System.out.println(“inSubClass:x=“+x);}voiddoSomething(){super.doSomething();//callmethodofsuperclassSystem.out.println(“inSubClass.doSomething()”);System.out.println(“super.x=”+super.x+“sub.x=”+x)}}publicclassinheritance{publicstaticvoidmain(Stringargs[]){SubClasssubC=newSubClass();subC.doSomething();}}86Super(3)classSubClassextendsSuper(4)運行結果c:\>javainheritanceinSuperClass:x=3inSubClass:x=5inSuperClass.doSomething()inSubClass.doSomething()super.x=3sub.x=587Super(4)運行結果87方法重寫應遵循的原則(1)改寫后的方法不能比被重寫的方法有更嚴格的訪問權限(2)改寫后的方法不能比重寫的方法產生更多的例外88方法重寫應遵循的原則(1)改寫后的方法不能比被重寫的方法有更方法重寫應遵循的原則classParent{publicvoidfunction()}}classChildextendsParent{privatevoidfunction()}}//出錯,訪問權限變小publicclassOverriddenTest{publicstaticvoidmain(Stringargs[]){Parentp1=newParent();Parentp2=newChild();p1.function();p2.function();}}89方法重寫應遵循的原則classParent{89對象狀態的確定(instanceof)Manager和Contractor都是Employee的子類使用instanceof來測試一個對象的類型(指定類及子類)。(返回boolean類型)
publicvoidmethod(Employeee){if(einstanceofManager)Managerm=(Manager)e;System.out.println("Thisisthemanagerof"+m.department);}elseif(einstanceofContractor){…}//dosomethingasaContractor}90對象狀態的確定(instanceof)Manager和Con對象的類型轉換用類型轉換來恢復一個對象的全部功能。向上類型轉換是將子類對象強制類型轉換為父類類型,這總是允許的,而且不需要強制類型轉換運算符。對于向下類型轉換(將父類類型強制轉換為子類類型),編譯器必須滿足類型轉換至少是可能的這樣的條件。比如,任何將Manager轉換成Contractor引用的嘗試是肯定不允許的,因為Contractor不是一個Manager。類型轉換發生的類必須是當前引用類型的子類。91對象的類型轉換用類型轉換來恢復一個對象的全部功能。91對象類型轉換實例classBase{
publicStringstr="helloBase...";
public
voidhello(){System.out.println(str);}}classSubextendsBase{
publicStringstr="helloSub...";
public
voidhello(){System.out.println(str);}}
public
classtwo{
public
static
voidmain(String[]args){Basebase=newBase();base.hello();//helloBase...
Subsub=newSub();sub.hello();//helloSub...
Basebs=newSub();bs.hello();//helloSub...
Bases=newSub();Subs1=(Sub)s;s1.hello();//helloSub...
Subsb=(Sub)newBase();sb.hello();////error
}}92對象類型轉換實例classBase{publicc課堂習題GiventhefollowingcodeclassBase{}classAgextendsBase{publicStringgetFields(){Stringname="Ag";returnname;}}publicclassAvf{publicstaticvoidmain(Stringargv[]){Basea=newAg();//Here}}下面哪行代碼放在注釋處,可以輸出"Ag"?1)System.out.println(a.getFields());2)System.out.println();3)System.out.println((Base)a.getFields());4)System.out.println(((Ag)a).getFields());93課堂習題Giventhefollowingcode下面多態性是由封裝性和繼承性引出的面向對象程序設計語言的另一特征。靜態多態性(編譯時多態〕
由方法重載(overload)實現動態多態性(運行時多態)子類對象可以作為父類對象使用。在程序中凡是需要父類對象的地方,都可以用子類對象代替。由方法重寫(overridden)實現調用規則:根據實例的類型決定調用的方法。94多態性是由封裝性和繼承性引出的面向對象程序設計語言的另一特征classA{inti,j;A(inta,intb){i=a;j=b;}voidshow(Stringmsg){System.out.println(msg+i+""+j);}}classBextendsA{
intk;B(inta,intb,intc){
super(a,b);k=c;}
voidshow(Stringmsg){System.out.println(msg+k);}}classtest{
public
static
voidmain(Stringargs[]){AsubOb=newB(1,2,3);subOb.show("ThisisB:");//調用B中的方法show()Asub=newA(1,2);sub.show("ThisisA:");//調用B中的方法show()}}運行結果:ThisisB:3ThisisA:1295classA{inti,j;運行結果:95課堂練習寫出輸出結果:classVehicle{ publicvoiddrive(){ System.out.println("Vehicle:drive"); }}classCarextendsVehicle{ publicvoiddrive(){ System.out.println("Car:drive"); }}96課堂練習寫出輸出結果:96publicclassTest{ publicstaticvoidmain(Stringargs[]){ Vehiclev; Carc; v=newVehicle(); c=newCar(); v.drive(); c.drive(); v=c; v.drive(); }}Vehicle:driveCar:driveCar:drive97publicclassTest{Vehicle:dr主要內容4.1面向對象的基本概念4.2定義Java類4.3Java對象4.4Java包4.5Java的面向對象特性4.6抽象類4.7接口98主要內容4.1面向對象的基本概念984.6抽象類-abstract用abstract來修飾類或方法
abstractclassabstractClass{…}abstractreturnTypeabstractMethod([paramlist])抽象類不能被實例化,必須被繼承,抽象方法必須被重寫,生成它的子類。抽象方法只需聲明,無需實現;抽象類不一定要包含抽象方法,若類中包含了抽象方法,則該類必須被定義為抽象類994.6抽象類-abstract用abstract來修飾類或抽象類實例abstractclassA{abstractvoidcallme();voidcallmetoo(){System.out.println("Thisisaconcretemethod.");}}classBextendsA{voidcallme(){System.out.println("B'simplementationofcallme.");}}classAbstractDemo{publicstaticvoidmain(Stringargs[]){Bb=newB();b.callme();b.callmetoo();}}100抽象類實例abstractclassA{100主要內容4.1面向對象的基本概念4.2定義Java類4.3Java對象4.4Java包4.5Java的面向對象特性4.6抽象類4.7接口101主要內容4.1面向對象的基本概念1014.7接口接口類似抽象類,只包含常量和方法的定義,而沒有變量和方法的實現
interfaceCollection{intMAX_NUM=100;voidadd(Objectobj);voiddelete(Objectobj);Objectfind(Objectobj);intcurrentCount();}1024.7接口接口類似抽象類,只包含常量和方法的定義,而沒有變接口定義完整的接口聲明:
[public]interfaceinterfaceName[extendslistOfSuperInterface]{…}接口體包括常量定義和方法定義常量定義:typeNAME=value;該常量被實現該接口的多個類共享;具有public,final,static的屬性.方法體定義:(具有public和abstract屬性,因此接口中的所有方法都是抽象的)
returnTypemethodName([paramlist])103接口定義完整的接口聲明:103接口的實現在類的聲明中用implements子句來表示一個類使用某個接口.一個類可以實現多個接口,在implements子句中用逗號分開必須實現接口中定義的所有方法104接口的實現在類的聲明中用implements子句來表示一個類接口的實現interfaceIrect{doublew=3,l=4;voidcompute();}classCrectimplementsIrect{publicvoidcompute(){System.out.println("邊長分別為3和4的長方形面積為:"+w*l);}}publicclassInterfaceDemo{publicstaticvoidmain(Stringargs[]){Crectr=newCrect();pute();}}105接口的實現interfaceIrect{105接口作用(1)通過接口實現不相關類的相同行為,而無需考慮這些類之間的關系.(2)通過接口指明多個類需要實現的方法(3)利用接口的多態性,動態加載不同類的實例106接口作用(1)通過接口實現不相關類的相同行為,而無需考慮這些一個類實現多個接口的例子107一個類實現多個接口的例子107動態加載不同類的實例public
interface
Person
{
public
double
calcuMonthlySalary(double
sal,
int
type);
}
public
class
Manager
implements
Person
{
public
Manager()
{
}
public
double
calcuMonthlySalary(double
sal,
int
type)
{
System.out.println("Manager:
"+(sal*type*3));
return
sal*type*2;
}
}
public
class
Employee
implements
Person
{
public
Employee()
{
}
public
double
calcuMonthlySalary(double
sal,
int
type)
{
System.out.println("Employee:
"+(sal*type*2));
return
sal*type*1.5;
}
}
}
108動態加載不同類的實例public
interface
Perpublic
class
SalaryManageTest
{
public
static
void
main(String[]
args)
throws
Exception{
Person
personService
=
(Person)Class.forName(args[0]).newInstance();
if
(args[1]
!=
null
&&
args[1]
!=
""
&&
args[2]
!=
null
&&
args[2]
!=
""){
int
sal
=
Integer.valueOf(args[1]).intValue();
int
type
=
Integer.valueOf(args[2]).intValue();
//這里可以根據傳入參數的不同,調用不同的實現類,
//如果再增加一類新的成員,也只要新增一個類,無需修改方法
personService.calcuMonthlySalary(sal,
type);
}
}
}
109public
class
SalaryManageTest
謝謝觀賞謝謝觀賞110java類和對象設計java類和對象設計java類和對象設計2主要內容4.1面向對象的基本概念4.2定義Java類4.3Java對象4.4Java包4.5Java的面向對象特性4.6抽象類4.7接口java類和對象設計java類和對象設計java類和對象設計111主要內容4.1面向對象的基本概念4.2定義Java類4.3Java對象4.4Java包4.5Java的面向對象特性4.6抽象類4.7接口112主要內容4.1面向對象的基本概念24.1面向過程與面向對象面向過程程序設計:C語言分析出解決問題所需步驟(過程),然后用函數把這些步驟一步一步實現,使用時一個一個依次調用。程序的數據與操作(函數)分離,導致難以擴展,維護困難代碼重用性低1134.1面向過程與面向對象面向過程程序設計:C語言34
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 項目管理中自我提升的方法與途徑試題及答案
- 證券從業資格證資產利用效率評估試題及答案
- 港口物流操作流程優化考核試卷
- 環保通風設備技術創新與市場布局前景考核試卷
- 白酒市場的渠道管理與銷售策略考核試卷
- 電纜線路敷設過程中的應力控制考核試卷
- 2024項目管理考試實務問題試題及答案
- 西溝土地整治方案范本
- 證券分析模型的應用考試試題及答案
- 項目管理考試核心內容的詳細解讀試題及答案
- DB33T 809-2010 農村水電站運行管理技術規程
- 民航貴州監管局制員工招聘筆試真題2023
- 2022版義務教育(歷史)課程標準(附課標解讀)
- 天津市保溫裝飾板外墻外保溫系統技術規程
- 《 大學生軍事理論教程》全套教學課件
- CJT 526-2018 軟土固化劑 標準
- 品質提升計劃改善報告課件
- NB-T10208-2019陸上風電場工程施工安全技術規范
- 《跟上兔子》繪本五年級第1季A-Magic-Card
- 在線網課知慧《形勢與政策(吉林大學)》單元測試考核答案
- 三年級必讀書課外閱讀測試(附答案)
評論
0/150
提交評論