版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第4、5章 類和對象設(shè)計主要內(nèi)容4.1 面向?qū)ο蟮幕靖拍?.2 定義Java類4.3 Java對象4.4 Java包4.5 Java的面向?qū)ο筇匦?.6 抽象類4.7 接口4.8 內(nèi)部類4.1面向?qū)ο蟮幕靖拍蠲嫦驅(qū)ο蟪绦蛟O(shè)計圍繞的幾個主要概念:n抽象數(shù)據(jù)類型n類、類型層次(子類)n對象,消息和方法n封裝性,繼承性、多態(tài)性抽象數(shù)據(jù)類型class Car int color_number; int door_number; int speed; void brake() void speedUp() ; void slowDown() 計算機中的對象的原型 現(xiàn)實生活中的對象類n類是描述對象的“
2、基本原型”,它定義一種對象所能擁有的數(shù)據(jù)和能完成的操作,在面向?qū)ο蟮某绦蛟O(shè)計中,類是程序的基本單元。 程序中的對象是類的一程序中的對象是類的一個實例,是一個軟件單個實例,是一個軟件單元,它由一組結(jié)構(gòu)化的元,它由一組結(jié)構(gòu)化的數(shù)據(jù)和在其上的一組操數(shù)據(jù)和在其上的一組操作構(gòu)成作構(gòu)成。變量變量方法方法變量,方法,消息n變量:指對象所處的狀態(tài)n方法:指對象的功能單元。n軟件對象通過相互間傳遞消息來相互作用和通信n消息由三部分組成:n1. 接受消息的對象n2. 要完成方法的名字n3. 方法需要的參數(shù)對象對象B對象對象 Amessage封裝n什么是封裝?n封裝把對象的所有組成部分組合在一起,封裝定義程序如何引
3、用對象的數(shù)據(jù),封裝實際上使用方封裝實際上使用方法將類的數(shù)據(jù)隱藏法將類的數(shù)據(jù)隱藏起來,控制用戶對起來,控制用戶對類的修改和訪問數(shù)類的修改和訪問數(shù)據(jù)的程度。據(jù)的程度。私有數(shù)據(jù)私有數(shù)據(jù)方法方法方法方法數(shù)據(jù)數(shù)據(jù)對象對象A對象對象B公有數(shù)據(jù)公有數(shù)據(jù)子類n什么是子類?n子類是作為另一個類的擴充或修正所定義的一個類.bicycle(super class)Mountain bikesRacing bikesTandem bikessub class繼承n什么是繼承?n繼承是子類利用父類中定義的方法和變量就像它們屬于子類本身一樣.class Car int color_number; int door_num
4、ber; int speed; push_break() add_oil() class Trash_Car extends Car double amount; fill_trash() 對象的生命周期n類的定義n對象實例化n對象初始化n對象的使用n對象的清除主要內(nèi)容4.1 面向?qū)ο蟮幕靖拍?.2 定義Java類4.3 Java對象4.4 Java包4.5 Java的面向?qū)ο筇匦?.6 抽象類4.7 接口4.8 內(nèi)部類4.2 定義Java 類n包括類聲明和類體n類聲明: publicabstract|final class 類名 extends 父類名 implements 接口名 Jav
5、a類體 class 類名 public | protected | private staticfinal 類型 變量名; /成員變量 public | protected | private staticfinal | abstract 返回值類型 方法名(參數(shù)列表) 方法體 /成員方法 注意事項n成員變量與局部變量的區(qū)別;n成員方法的參數(shù)列表有零個或多個參數(shù)構(gòu)成,參數(shù)之間用逗號分隔,每個參數(shù)由一個數(shù)據(jù)類型和變量名構(gòu)成;n如果方法不返回任何值,必須將其返回值類型聲明為void;n如果方法有返回值,可通過return語句傳回給調(diào)用者,且返回值必須和定義的返回值類型一致。成員方法(值參傳遞) 1
6、1val0value11value11val55value11val成員方法(值參傳遞) xc1sc9nullxc1sc9xc1sc6成員方法(值參傳遞) ref20.0ptnullptValueref20.0ptptValueref99.0ptptValue成員方法(方法體)n方法體包括局部變量的聲明以及所有合法的Java指令。n局部變量的作用域在該方法內(nèi)部。n若局部變量與類的成員變量同名,則類的成員變量被隱藏。成員方法(方法體)實例(1)class Variable int x=0,y=0,z=0; /類的成員變量 void init(int x,int y) this.x=x; this
7、.y=y; int z=5; /局部變量,隱藏全局變量 System.out.println(* in init*); System.out.println(x=+x+ y=+y+ z=+z); 成員方法(方法體)實例(2)public class VariableTest public static void main(String args) Variable v=new Variable();System.out.println(*before init*);System.out.println(x=+v.x+ y=+v.y+ z=+v.z);v.init(20,30);System.o
8、ut.println(*after init*);System.out.println(x=+v.x+ y=+v.y+ z=+v.z);成員方法(方法體)實例(3)運行結(jié)果 *before init* x=0 y=0 z=0 * in init * x=20 y=30 z=5 *after init* x=20 y=30 z=0方法重載(Method Overloading)n方法重載指多個方法享有相同的方法名n區(qū)別在于:參數(shù)類型不同,或個數(shù)不同;n返回類型不能用來區(qū)分重載的方法。方法重載public class OverLoad int i = 3, j=4; int sum( ) retu
9、rn i+j; int sum(int a, int b) return a+b; int sum(int a,int b, int c) return a+b+c; double sum(double a, double b) return a+b; public static void main(String args) OverLoad o = new OverLoad(); System.out.println(o.sum(); System.out.println(o.sum(5,6); System.out.println(o.sum(5,8,4); System.out.prin
10、tln(o.sum(3.2,2.15); 構(gòu)造方法n構(gòu)造方法具有和類名相同的名稱,而且不構(gòu)造方法具有和類名相同的名稱,而且不返回任何數(shù)據(jù)類型返回任何數(shù)據(jù)類型n構(gòu)造方法只能由new運算符調(diào)用n利用構(gòu)造方法進行初始化初始化n構(gòu)造方法不能被繼承n重載重載經(jīng)常用于構(gòu)造方法構(gòu)造方法n示例class Point int x,y; Point() x=0; y=0; Point(int x, int y) this.x=x; this.y=y; 主方法與命令行參數(shù)npublic static void main(String args)n該方法被定義為public static void也就是公開的靜態(tài)的無
11、返回值的方法,且參數(shù)args為一個字符串數(shù)組,用來接收從命令行輸入的參數(shù)。n參數(shù)之間使用空格隔開。nJava解釋器會自動處理,把用空格隔開的各個參數(shù)通過args數(shù)組傳遞給main方法。n參數(shù)的下標從0開始,args0表示傳入的第一個參數(shù),args1表示傳入的第二個參數(shù),以此類推。Example:public class MainTest public static void main(String args) int n=args.length;if(n=0)System.out.println(no parameter!);elseSystem.out.println(number of p
12、arameters:+n);for(int i=0;i java inheritancein SuperClass: x=3in SubClass: x=5in SuperClass.doSomething()in SubClass.doSomething()super.x=3 sub.x=570方法重寫應(yīng)遵循的原則n(1)改寫后的方法不能比被重寫的方法有更嚴格的訪問權(quán)限n(2)改寫后的方法不能比重寫的方法產(chǎn)生更多的例外71方法重寫應(yīng)遵循的原則class Parent public void function( ) class Child extends Parent private void
13、 function( ) /出錯,訪問權(quán)限變小public class OverriddenTest public static void main(String args) Parent p1=new Parent(); Parent p2=new Child(); p1.function(); p2.function(); 72多態(tài)性n是由封裝性和繼承性引出的面向?qū)ο蟪绦蛟O(shè)計語言的另一特征。n靜態(tài)多態(tài)性(編譯時多態(tài) 由方法重載(overload)實現(xiàn)n動態(tài)多態(tài)性(運行時多態(tài))n子類對象可以作為父類對象使用。在程序中凡是需要父類對象的地方,都可以用子類對象代替。n由方法重寫(overridd
14、en)實現(xiàn)n調(diào)用規(guī)則:根據(jù)實例的類型決定調(diào)用的方法。class A int i, j; A(int a, int b) i = a; j = b; void show(String msg) System.out.println(msg + i + + j); class B extends A int k; B(int a, int b, int c) super(a, b); k = c; void show(String msg) System.out.println(msg + k); class test public static void main(String args) A
15、subOb = new B(1, 2, 3); subOb.show(This is B: ); / 調(diào)用B中的方法show() A sub = new A(1, 2); sub.show(This is A: ); / 調(diào)用B中的方法show() 運行結(jié)果:This is B: 3This is A: 1 274對象狀態(tài)的確定(instanceof)nManager和Contractor都是Employee的子類n使用instanceof來測試一個對象的類型。 public void method(Employee e) if (e instanceof Manager) Manager m
16、 = (Manager)e; System.out.println( This is the manager of + m.department); else if ( e instanceof Contractor) /do something as a Contractor75對象的類型轉(zhuǎn)換n用類型轉(zhuǎn)換來恢復(fù)一個對象的全部功能。n向上類型轉(zhuǎn)換是將子類對象強制類型轉(zhuǎn)換為父類類型,這總是允許的,而且不需要強制類型轉(zhuǎn)換運算符。n對于向下類型轉(zhuǎn)換(將父類類型強制轉(zhuǎn)換為子類類型 ),編譯器必須滿足類型轉(zhuǎn)換至少是可能的這樣的條件。比如,任何將Manager轉(zhuǎn)換成Contractor引用的嘗試是肯定不允
17、許的,因為Contractor不是一個Manager。類型轉(zhuǎn)換發(fā)生的類必須是當前引用類型的子類。76對象類型轉(zhuǎn)換實例class Base public String str = hello Base.; public void hello() System.out.println(str); class Sub extends Base public String str = hello Sub.; public void hello() System.out.println(str); public class two public static void main(String args)
18、 Base base = new Base(); base.hello(); / hello Base. Sub sub = new Sub(); sub.hello(); / hello Sub. Base bs = new Sub(); bs.hello(); / hello Sub. Base s = new Sub(); Sub s1=(Sub)s; s1.hello(); / hello Sub. Sub sb = (Sub) new Base(); sb.hello(); / error 77課堂習題課堂習題Given the following codeclass Base cl
19、ass Ag extends Base public String getFields() String name = Ag; return name; public class Avf public static void main(String argv) Base a = new Ag(); /Here 下面哪行代碼放在注釋處,可以輸出下面哪行代碼放在注釋處,可以輸出 Ag?1) System.out.println(a.getFields();2) System.out.println();3) System.out.println(Base) a.getFields();
20、4) System.out.println( (Ag) a).getFields();78構(gòu)造方法在繼承中的使用n構(gòu)造方法不能繼承n如父類中只有默認的無參構(gòu)造方法,寫子類的構(gòu)造方法時不需要用super來初始化父類,它會自動調(diào)用父類的默認構(gòu)造函數(shù)。n當父類重寫了構(gòu)造函數(shù)后,父類默認的構(gòu)造函數(shù)就被屏蔽,此時在子類寫構(gòu)造函數(shù)時必須調(diào)用父類的某個(當父類有多個構(gòu)造函數(shù)時)79構(gòu)造方法在繼承中的使用示例class A A() System.out.println(Inside As constructor.); class B extends A / 創(chuàng)建創(chuàng)建A的以個子類的以個子類. B() Syste
21、m.out.println(Inside Bs constructor.); class C extends B / 創(chuàng)建另一個子類繼承創(chuàng)建另一個子類繼承B. C() System.out.println(Inside Cs constructor.); class CallingCons public static void main(String args) C c = new C(); 程序運行結(jié)果:Inside As constructor.Inside Bs constructor.Inside Cs constructor.80class Books String name; Bo
22、oks(String na) =na; class Book extends Books String author; Book(String author) super(“john”); /如果沒有這句,編譯出錯 this.author=author; /局部變量和成員變量同名時, this用于表示當前對象 構(gòu)造方法在繼承中的使用示例81public class test public static void main(String args) Book b=new Book(mike); System.out.println(name=+); System.o
23、ut.println(author=+b.author); 構(gòu)造方法在繼承中的使用示例運行結(jié)果:name=johnauthor=mike82final關(guān)鍵字n(1) final修飾變量,則成為常量n final type variableName;n 修飾成員變量時,定義時同時給出初始值,而修飾局部變量時不做要求。n(2)final修飾方法,則該方法不能被子類重寫n final returnType methodName(paramList)n n n 83final關(guān)鍵字n(3)final修飾類,則類不能被繼承n final class finalClassNamen n 84實例成員和類成
24、員n實例成員為特定實例所有,通過對象名訪問;類成員為類所有,不屬于某一個對象,可以通過類名訪問。n類成員的格式(static):nstatic type classVar;nstatic returnType classMethod(paramlist) nn n85實例變量和類變量n每個對象的實例變量都分配內(nèi)存n通過對象來訪問這些實例變量n類變量僅在生成第一個對象時分配內(nèi)存,所有實例對象共享同一個類變量。n類變量可通過類名直接訪問,無需先生成一個實例對象n也可以通過實例對象訪問類變量86實例變量和類變量class ABCD char data; static int_share_data;
25、class Demo ABCD a,b,c,d;object bchar dataobject cchar dataObject bchar datastatic intshare_dataobject bchar data87實例方法和類方法n類(static)方法不能訪問實例變量,只能訪問類變量n類方法可以由類名直接調(diào)用n類方法中不能使用this或super88實例方法和類方法class member static int classVar; int instanceVar; static void setClassVar(int i) classVar=i; / instanceVar=
26、i; /cant access nostatic member static int getClassVar() return classVar; void setInstanceVar(int i) classVar=i; instanceVar=i; int getInstanceVar( ) return instanceVar; 89實例方法和類方法public class test public static void main(String args) member m1=new member(); member m2=new member(); m1.setClassVar(1)
27、; 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(); 90實例方法和類方法n運行結(jié)果c: java memberTestm1.classVar=2 m2.classVar=2m
28、1.InstanceVar=11 m2.InstanceVar=2291課堂練習課堂練習Which of the following statements are true? 1) static methods do not have access to the implicit variable called this 2) A static method may be called without creating an instance of its class3) A static method may not be overriden to be non-static 4) A st
29、atic method may not be overloaded92課堂練習課堂練習寫出輸出結(jié)果:寫出輸出結(jié)果:class Vehicle public void drive() System.out.println(Vehicle: drive);class Car extends Vehicle public void drive() System.out.println(Car: drive);93public class Test public static void main (String args ) Vehicle v;Car c;v = new Vehicle();c =
30、new Car();v.drive();c.drive();v = c;v.drive();94主要內(nèi)容4.1 面向?qū)ο蟮幕靖拍?.2 定義Java類4.3 Java對象4.4 Java包4.5 Java的面向?qū)ο筇匦?.6 抽象類4.7 接口4.8 內(nèi)部類954.6 抽象類-abstractn用abstract來修飾類或方法n abstract class abstractClass n abstract returnType abstractMethod(paramlist)n抽象類不能被實例化,必須被繼承,抽象方法必須被重寫,生成它的子類。n抽象方法只需聲明,無需實現(xiàn);n抽象類不一定要
31、包含抽象方法,若類中包含了抽象方法,則該類必須被定義為抽象類96抽象類實例abstract class A abstract void callme(); void callmetoo() System.out.println(This is a concrete method.); class B extends A void callme() System.out.println(Bs implementation of callme.); class AbstractDemo public static void main(String args) B b = new B(); b.ca
32、llme(); b.callmetoo(); 97主要內(nèi)容4.1 面向?qū)ο蟮幕靖拍?.2 定義Java類4.3 Java對象4.4 Java包4.5 Java的面向?qū)ο筇匦?.6 抽象類4.7 接口4.8 內(nèi)部類984.7 接口n接口類似抽象類,只包含常量和方法的定義,而沒有變量和方法的實現(xiàn) interface Collection int MAX_NUM=100; void add(Object obj); void delete(Object obj); Object find(Object obj); int currentCount( ); 99接口定義n完整的接口聲明:n publ
33、ic interface interfaceNameextends listOfSuperInterface n接口體包括常量定義和方法定義n常量定義: type NAME=value; 該常量被實現(xiàn)該接口的多個類共享; 具有public ,final, static的屬性.n方法體定義:(具有 public和abstract屬性,因此接口中的所有方法都是抽象的) returnType methodName(paramlist)100接口的實現(xiàn)n在類的聲明中用implements子句來表示一個類使用某個接口.n一個類可以實現(xiàn)多個接口,在implements子句中用逗號分開n必須實現(xiàn)接口中定義的
34、所有方法101接口的實現(xiàn) interface Irect double w=3,l=4; void compute(); class Crect implements Irect public void compute() System.out.println( 邊長分別為邊長分別為3和和4的長方形面積為:的長方形面積為:+w*l); public class InterfaceDemo public static void main(String args) Crect r = new Crect(); pute(); 102接口作用n(1)通過接口實現(xiàn)不相關(guān)類的相同行為,而無需考慮這些類之
35、間的關(guān)系.n(2)通過接口指明多個類需要實現(xiàn)的方法n(3)利用接口的多態(tài)性,動態(tài)加載不同類的實例103一個類實現(xiàn)多個接口的例子104動態(tài)加載不同類的實例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: +(sa
36、l*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; 105public class SalaryManageTest public static void main(String args) throws Exception Pers
37、on personService = (Person)Class.forName(args0).newInstance(); if (args1 != null & args1 != & args2 != null & args2 != ) int sal = Integer.valueOf(args1).intValue(); int type = Integer.valueOf(args2).intValue(); /這里可以根據(jù)傳入?yún)?shù)的不同,調(diào)用不同的實現(xiàn)類, /如果再增加一類新的成員,也只要新增一個類,無需修改方法 personService.calcuMonthlySalary(s
38、al, type); 106主要內(nèi)容4.1 面向?qū)ο蟮幕靖拍?.2 定義Java類4.3 Java對象4.4 Java包4.5 Java的面向?qū)ο筇匦?.6 抽象類4.7 接口4.8 內(nèi)部類1074.8 Inner Class n嵌套類:在一個類的內(nèi)部嵌套定義類。n內(nèi)部類幾乎可以處于一個類內(nèi)部任何位置,可以與實例變量處于同一級,或處于方法之內(nèi),甚至是一個表達式的一部分。n外部類可以訪問內(nèi)部類的私有成員,內(nèi)部類也可以訪問外部類的私有成員108Inner Class簡單示例class OutterClass private int mOut = 10; public class InnerClass private int mIn = 0; public void printOutPrivate() System.out.println(mOut); public void printInPrivate() InnerClass inClass = new InnerClass(); / 直接打印內(nèi)部類的私有成員 System.out.println(inClass.mIn); public void printOutPrivate() InnerClass inClass = new InnerClass(); inClass.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 燃氣管道工程合同安全檢測
- 學校體育師資招聘合同范本
- 化工設(shè)備品牌租賃合約
- 醫(yī)藥行業(yè)財務(wù)管理辦法
- 訴訟保函協(xié)議書
- 圖書館車輛出入管理規(guī)定
- 酒店前臺主管聘用合同
- 2024房屋租賃分期付款合同范本
- 燃氣企業(yè)法律顧問聘用協(xié)議范本
- 水電站供排水管道工程合同范本
- 玻璃制造過程綠色節(jié)能技術(shù)創(chuàng)新
- 工程數(shù)學第5次作業(yè)(工程數(shù)學(本)形成性考核作業(yè)5)-國開輔導(dǎo)資料
- 廣東省深圳市龍華區(qū)2023-2024學年中考適應(yīng)性考試物理試題含解析
- 學憲法講憲法知識競賽活動方案
- MOOC 國際私法-暨南大學 中國大學慕課答案
- 《客艙安全與應(yīng)急處置》-課件:應(yīng)急撤離的原因和原則
- 前列腺電切術(shù)麻醉管理
- 2024年畢節(jié)市融資擔保集團有限公司招聘筆試參考題庫附帶答案詳解
- 椎管內(nèi)腫瘤切除術(shù)的手術(shù)后護理
- 《糧油食品加工技術(shù)》課程標準
- 華碩電腦行業(yè)供應(yīng)鏈的管理措施及策略
評論
0/150
提交評論