![第三章面向?qū)ο蟪绦蛟O(shè)計(jì)_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/26/1ff056fb-dac3-46e4-8c52-7bcb8421352b/1ff056fb-dac3-46e4-8c52-7bcb8421352b1.gif)
![第三章面向?qū)ο蟪绦蛟O(shè)計(jì)_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/26/1ff056fb-dac3-46e4-8c52-7bcb8421352b/1ff056fb-dac3-46e4-8c52-7bcb8421352b2.gif)
![第三章面向?qū)ο蟪绦蛟O(shè)計(jì)_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/26/1ff056fb-dac3-46e4-8c52-7bcb8421352b/1ff056fb-dac3-46e4-8c52-7bcb8421352b3.gif)
![第三章面向?qū)ο蟪绦蛟O(shè)計(jì)_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/26/1ff056fb-dac3-46e4-8c52-7bcb8421352b/1ff056fb-dac3-46e4-8c52-7bcb8421352b4.gif)
![第三章面向?qū)ο蟪绦蛟O(shè)計(jì)_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/26/1ff056fb-dac3-46e4-8c52-7bcb8421352b/1ff056fb-dac3-46e4-8c52-7bcb8421352b5.gif)
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第三章第三章 Java與面向?qū)ο蠹夹g(shù)與面向?qū)ο蠹夹g(shù)1、面向?qū)ο蟮母拍?、面向?qū)ο蟮母拍?、Java中的類(lèi)、方法和變量中的類(lèi)、方法和變量3、Java名字空間及訪問(wèn)規(guī)則名字空間及訪問(wèn)規(guī)則4、Java中的抽象類(lèi)、接口和程序包中的抽象類(lèi)、接口和程序包5、對(duì)象的構(gòu)造方法、對(duì)象的構(gòu)造方法6. 6. 初始化塊初始化塊 所謂面向?qū)ο蟮姆椒▽W(xué),就是使我們分析、設(shè)計(jì)和實(shí)現(xiàn)一個(gè)系統(tǒng)的方法盡可能地接近我們認(rèn)識(shí)一個(gè)系統(tǒng)的方法。包括:1、面向?qū)ο蟮母拍睢⒚嫦驅(qū)ο蟮母拍?面向?qū)ο蟮姆治觯∣OA, Object-Oriented Analysis) 面向?qū)ο蟮脑O(shè)計(jì)(OOD, Object-Oriented Design) 面向
2、對(duì)象的程序設(shè)計(jì)(OOPL, Object-Oriented Program)面向?qū)ο蠹夹g(shù)主要圍繞以下幾個(gè)概念: 對(duì)象、抽象數(shù)據(jù)類(lèi)型、類(lèi)、類(lèi)型層次(子類(lèi))、繼承性、多態(tài)性。 對(duì)象有兩個(gè)層次的概念:變量變量方法方法1、面向?qū)ο蟮母拍睢⒚嫦驅(qū)ο蟮母拍顚?duì)象對(duì)象 現(xiàn)實(shí)生活中對(duì)象指的是客觀世界的實(shí)體; 程序中對(duì)象就是一組變量和相關(guān)方法的集合,其中變量表明對(duì)象的狀態(tài),方法表明對(duì)象所具有的行為?,F(xiàn)實(shí)生活中的對(duì)象可以將現(xiàn)實(shí)生活中的對(duì)象可以將現(xiàn)實(shí)生活中的對(duì)象經(jīng)過(guò)抽象,映射為程序中經(jīng)過(guò)抽象,映射為程序中的對(duì)象。的對(duì)象。Class Car int color_number; int door_number; int
3、speed; void brake() void speedUp() void slowDown() 抽象數(shù)據(jù)類(lèi)型1、面向?qū)ο蟮母拍?、面向?qū)ο蟮母拍顚?duì)象對(duì)象 對(duì)象在程序中是通過(guò)對(duì)象在程序中是通過(guò)一種抽象數(shù)據(jù)類(lèi)型來(lái)描述一種抽象數(shù)據(jù)類(lèi)型來(lái)描述的,這種抽象數(shù)據(jù)類(lèi)型稱(chēng)的,這種抽象數(shù)據(jù)類(lèi)型稱(chēng)為類(lèi)(為類(lèi)(Class)。)。q程序中的對(duì)象是類(lèi)的一個(gè)實(shí)例,是一個(gè)軟件單元,它由一組結(jié)構(gòu)化的數(shù)據(jù)和在其上的一組操作構(gòu)成。1、面向?qū)ο蟮母拍?、面向?qū)ο蟮母拍铑?lèi)類(lèi)q相似的對(duì)象可以歸并到同一個(gè)類(lèi)中去,就像傳統(tǒng)語(yǔ)言中的變量與類(lèi)型關(guān)系一樣。q 類(lèi)是描述對(duì)象的“基本原型”,它定義一類(lèi)對(duì)象所能擁有的數(shù)據(jù)和能完成的操作。在面向?qū)ο蟮?/p>
4、程序設(shè)計(jì)中,類(lèi)是程序的基本單元。Car car1;Car car2; Car carN;1、面向?qū)ο蟮母拍?、面向?qū)ο蟮母拍铑?lèi)類(lèi)n消息軟件對(duì)象通過(guò)相互間傳遞消息來(lái)相互作用和通信,一個(gè)消息由三部分組成: 1. 接受消息的對(duì)象 2. 接收對(duì)象要采取的方法 3. 方法需要的參數(shù)對(duì)象對(duì)象B對(duì)象對(duì)象 A消息消息1、面向?qū)ο蟮母拍?、面向?qū)ο蟮母拍铑?lèi)類(lèi)n變量:指對(duì)象的所知道的狀態(tài)。n方法:指對(duì)象的功能單元。n一個(gè)例子class Hello private String s;public void showString() System.out.println(s);public void changeStri
5、ng(String str) s = str; 變量方法showString()方法changeString()1、面向?qū)ο蟮母拍?、面向?qū)ο蟮母拍?類(lèi)類(lèi)調(diào)用對(duì)象的方法相當(dāng)于給對(duì)象發(fā)送消息,收到消息的對(duì)象通過(guò)調(diào)用對(duì)象的方法相當(dāng)于給對(duì)象發(fā)送消息,收到消息的對(duì)象通過(guò)改變自身的狀態(tài)或者向其它對(duì)象發(fā)送消息來(lái)響應(yīng)消息。改變自身的狀態(tài)或者向其它對(duì)象發(fā)送消息來(lái)響應(yīng)消息。n在程序中所操作的對(duì)象是類(lèi)的一個(gè)實(shí)例。n創(chuàng)建一個(gè)對(duì)象: Hello obj=new Hello();n調(diào)用方法: obj. changeString(“dance”); n為什么要使用類(lèi)?1、面向?qū)ο蟮母拍?、面向?qū)ο蟮母拍铑?lèi)類(lèi)n采用簡(jiǎn)單數(shù)據(jù)類(lèi)型
6、表示現(xiàn)實(shí)世界中概念的存在很大的局限性。例如:采用int型數(shù)據(jù)表示一個(gè)日期概念,需要使用3個(gè)變量:int day, month, year;使用類(lèi)可以把現(xiàn)實(shí)問(wèn)題中的對(duì)象映射為程序中的一個(gè)整體類(lèi)。n如果要表示2個(gè)人的生日,就要使用6個(gè)變量n并且在使用中必須時(shí)刻注意三者的聯(lián)系和約束關(guān)系nint day1, month1, year1;nint day2, month2, year2;類(lèi)中不但有變量,還有與之相關(guān)的操作所定義的方法。將變量和方法封裝在一個(gè)類(lèi)中,可以對(duì)成員變量進(jìn)行隱藏對(duì)成員變量進(jìn)行隱藏,外部對(duì)類(lèi)成員的訪問(wèn)都通過(guò)方法進(jìn)行,能夠保護(hù)類(lèi)成員不被非法修改保護(hù)類(lèi)成員不被非法修改。class Bir
7、thDate public int day,month,year; public int tomorrow() BirthDate mybirth, yourbirth;1、面向?qū)ο蟮母拍睢⒚嫦驅(qū)ο蟮母拍铑?lèi)類(lèi)BirthDate lily;lily.day=31;lily.month=5;lily.year=1992;已知當(dāng)前日期對(duì)象,求第2天的日期對(duì)象: lily.day =lily.day+1;如果lily.day已經(jīng)為31,操作結(jié)果是非法狀態(tài)。使用類(lèi)的另一個(gè)方便之處,就是操作上的方便為什么要使用類(lèi)?可以定義一個(gè)成員方法tomorrow(),求第2天的日期對(duì)象。外部要獲得當(dāng)前日期的后一天時(shí),
8、只要調(diào)用: lily.tomorrow();n封裝把對(duì)象的所有組成部分組合在一起私有數(shù)據(jù)私有數(shù)據(jù) 方法方法 方法方法數(shù)據(jù)數(shù)據(jù)對(duì)象對(duì)象A對(duì)象對(duì)象B公有數(shù)據(jù)公有數(shù)據(jù)封裝定義程序如何引用對(duì)象的數(shù)據(jù),封裝實(shí)際上使用方法將類(lèi)的數(shù)據(jù)隱藏起來(lái),控制用戶(hù)對(duì)類(lèi)的修改和訪問(wèn)數(shù)據(jù)的程度。1、面向?qū)ο蟮母拍?、面向?qū)ο蟮母拍罘庋b封裝子類(lèi)是作為另一個(gè)類(lèi)的擴(kuò)充或修正而定義的一個(gè)類(lèi)。bicycle(super class)Mountain bikesRacing bikesTandem bikessub class1、面向?qū)ο蟮母拍?、面向?qū)ο蟮母拍钭宇?lèi)子類(lèi)繼承是子類(lèi)利用父類(lèi)中定義的方法和變量,就像它們屬于子類(lèi)本身一樣。cla
9、ss Car int color_number; int door_number; int speed; public void push_break() public void add_oil() class Trash_Car extends Car double amount; public void fill_trash() 1、面向?qū)ο蟮母拍?、面向?qū)ο蟮母拍罾^承繼承extends Car的作用就是的作用就是 copy 了了父類(lèi)定義父類(lèi)定義 的變量和方法的變量和方法n方法的重寫(xiě)重寫(xiě)使得在子類(lèi)中可以重新定義父類(lèi)中已有的方法,從而體現(xiàn)出子類(lèi)自己的行為。class Car int color
10、_number; int door_number; int speed; public void push_break() speed = 0; public void add_oil() class Trash_Car extends Car double capacity; public void fill_trash() public void push_break() speed = speed 10; 1、面向?qū)ο蟮母拍睢⒚嫦驅(qū)ο蟮母拍罘椒ǖ闹貙?xiě)方法的重寫(xiě)重載指得是在同一個(gè)類(lèi)中至少有多個(gè)方法名字、類(lèi)型相同,但是參數(shù)不同。類(lèi)類(lèi)void show(int int_num)void sho
11、w(double double_num)void show(int int_num, float float_num)1231.23123,1.231、面向?qū)ο蟮母拍?、面向?qū)ο蟮母拍罘椒ǖ闹剌d(多態(tài)性)方法的重載(多態(tài)性)n類(lèi)、方法、變量定義的語(yǔ)法規(guī)范n對(duì)象的創(chuàng)建和使用n繼承、重寫(xiě)、重載、多態(tài)等概念n內(nèi)嵌類(lèi)(inner class)2、Java中的類(lèi)、方法和變量中的類(lèi)、方法和變量2、面向?qū)ο蟮膶?shí)現(xiàn)、面向?qū)ο蟮膶?shí)現(xiàn) Java中的類(lèi)、方法和變量中的類(lèi)、方法和變量n類(lèi)的嚴(yán)格定義及修飾字類(lèi)的修飾字: public abstract | final 缺省方式為缺省方式為 friendly類(lèi)的修飾字類(lèi)的修
12、飾字 class 類(lèi)名稱(chēng)類(lèi)名稱(chēng) extends 父類(lèi)名稱(chēng)父類(lèi)名稱(chēng)implements 接口名稱(chēng)列表接口名稱(chēng)列表 變量定義及初始化;變量定義及初始化; 方法定義及方法體;方法定義及方法體;類(lèi)體,其類(lèi)體,其中定義了該類(lèi)中所有中定義了該類(lèi)中所有的變量和該類(lèi)所支持的方法,的變量和該類(lèi)所支持的方法,稱(chēng)為成員變量和成員方法。稱(chēng)為成員變量和成員方法。變量修飾字變量修飾字 變量數(shù)據(jù)類(lèi)型變量數(shù)據(jù)類(lèi)型 變量名變量名1,變量名變量名2=變量初值變量初值; 變量的定義及修飾字public | protected | private static final transient volatile成員變量的類(lèi)型可以是Ja
13、va中任意的數(shù)據(jù)類(lèi)型,包括簡(jiǎn)單類(lèi)型,類(lèi),接口,數(shù)組。2、Java中的類(lèi)、方法和變量中的類(lèi)、方法和變量變量定義的語(yǔ)法規(guī)范變量定義的語(yǔ)法規(guī)范成員變量的作用范圍是定義它的類(lèi)。方法修飾字方法修飾字 返回類(lèi)型返回類(lèi)型 方法名稱(chēng)方法名稱(chēng)(參數(shù)參數(shù)1,參數(shù)參數(shù)2,) throws exceptionList (statements;) /方法體:方法的內(nèi)容方法體:方法的內(nèi)容方法的定義及修飾字public | protected | private static final | abstract native synchronized 返回類(lèi)型可以是任意的Java數(shù)據(jù)類(lèi)型,當(dāng)一個(gè)方法不需要返回值時(shí),返回類(lèi)型為
14、void。2、Java中的類(lèi)、方法和變量中的類(lèi)、方法和變量方法定義的語(yǔ)法規(guī)范方法定義的語(yǔ)法規(guī)范 參數(shù)的類(lèi)型可以是簡(jiǎn)單數(shù)據(jù)類(lèi)型,也可以是引用數(shù)據(jù)類(lèi)型(數(shù)組、類(lèi)或接口),參數(shù)傳遞方式是值傳遞。 方法體是對(duì)方法的實(shí)現(xiàn)。它包括局部變量的聲明以及所有合法的Java指令。局部變量的作用域只在該方法內(nèi)部。 一個(gè)簡(jiǎn)單的類(lèi)一個(gè)簡(jiǎn)單的類(lèi)class Car int car_number; void set_number(int car_num) car_number=car_num; void show_number() System.out.println (“My car No. is : ”+car_numb
15、er); class CarDemo public static void main(String args) Car Democar=new Car(); DemoCar.set_number(3838); DemoCar.show_number(); My car No. is : 38382、Java中的類(lèi)、方法和變量中的類(lèi)、方法和變量一個(gè)簡(jiǎn)單的類(lèi)一個(gè)簡(jiǎn)單的類(lèi)(1)對(duì)象的生成 通過(guò)new操作符生成一個(gè)對(duì)象;例如:Car Benz,;Benz = new Car(); Car BWM= new Car(); 2、Java中的類(lèi)、方法和變量中的類(lèi)、方法和變量對(duì)象對(duì)象(2)對(duì)象的構(gòu)造過(guò)程 為對(duì)
16、象開(kāi)辟空間,并對(duì)對(duì)象的成員變量進(jìn)行缺省的初始化; 對(duì)成員變量進(jìn)行指定的初始化; 調(diào)用構(gòu)造方法。(3)對(duì)象的使用 利用對(duì)象,通過(guò)運(yùn)算符 可以實(shí)現(xiàn)對(duì)變量的訪問(wèn)和方法的調(diào)用。例如: BirthDate lily=new BirthDate();int day;day = lily.day; /引用lily的成員變量daylily.tomorrow();/調(diào)用lily的方法tomorrow()2、Java中的類(lèi)、方法和變量中的類(lèi)、方法和變量對(duì)象對(duì)象 類(lèi)的繼承class Car int car_number; void set_number(int car_num) car_number=car_num
17、; void show_number() System.out.println (“My car No. is :”+car_number); 2、Java中的類(lèi)、方法和變量中的類(lèi)、方法和變量繼承繼承class TrashCar extends Car int capacity; void set_capacity(int trash_car_capacity) capacity=trash_car_capacity; void show_capacity() System.out.println(“My capacity is: ” + capacity); 2、Java中的類(lèi)、方法和變量中
18、的類(lèi)、方法和變量繼承繼承Car是父類(lèi),是父類(lèi),TrashCar是子類(lèi)。是子類(lèi)。TrashCar中繼承了中繼承了Car中的兩個(gè)方法,同時(shí)又增加了兩個(gè)新方法。中的兩個(gè)方法,同時(shí)又增加了兩個(gè)新方法。class CarDemo public static void main(String args) TrashCar demoTrashCar = new TrashCar(); demoTrashCar.set_number(4949); demoTrashCar.show_number(); demoTrashCar.set_capacity(20); demoTrashCar.show_capac
19、ity(); 繼承的方法繼承的方法新增加的方法新增加的方法2、Java中的類(lèi)、方法和變量中的類(lèi)、方法和變量繼承繼承q 繼承性是面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言的另一基本特征,通過(guò)繼承可以實(shí)現(xiàn)代碼的復(fù)用。2、Java中的類(lèi)、方法和變量中的類(lèi)、方法和變量繼承繼承如果缺省extends子句,則該類(lèi)為java.lang.Object的子類(lèi)。q通過(guò)在類(lèi)的聲明中加入extends子句來(lái)創(chuàng)建一個(gè)類(lèi)的子類(lèi):class SubClass extends SuperClassJava中不支持多重繼承。繼承而得到的類(lèi)為子類(lèi),被繼承的類(lèi)為父類(lèi),父類(lèi)包括所有直接或間接被繼承的類(lèi)。n何時(shí)選擇繼承?一個(gè)很好的經(jīng)驗(yàn):“B是一個(gè)A嗎?”如
20、果是則讓B做A的子類(lèi).例:研究生是學(xué)生嗎?那么研究生例:研究生是學(xué)生嗎?那么研究生就是學(xué)生的子類(lèi)就是學(xué)生的子類(lèi)2、Java中的類(lèi)、方法和變量中的類(lèi)、方法和變量繼承繼承常犯的錯(cuò)誤常犯的錯(cuò)誤A有一個(gè)有一個(gè)B嗎嗎? 例如讓汽例如讓汽車(chē)輪子成為汽車(chē)的子類(lèi)是錯(cuò)誤的車(chē)輪子成為汽車(chē)的子類(lèi)是錯(cuò)誤的例:研究生是例:研究生是people嗎?那么研究生嗎?那么研究生就是就是people的子類(lèi)的子類(lèi)繼承后得到繼承后得到的類(lèi)應(yīng)該是的類(lèi)應(yīng)該是同一類(lèi)同一類(lèi) 類(lèi)方法的重寫(xiě) 方法重寫(xiě)即指在子類(lèi)中重新定義父類(lèi)中已有的方法。class Car int color_number; int door_number; int speed
21、; public void push_break() speed = 0; public void add_oil() class Trash_Car extends Car double capacity; public void fill_trash() public void push_break() speed = speed 10; 2、Java中的類(lèi)、方法和變量中的類(lèi)、方法和變量重寫(xiě)重寫(xiě) 重寫(xiě)方法的調(diào)用 對(duì)于重寫(xiě)的方法,Java運(yùn)行時(shí)系統(tǒng)根據(jù)調(diào)用該方法的實(shí)例的類(lèi)型來(lái)決定選擇哪個(gè)方法調(diào)用。public class DemoCarpublic static void main( Str
22、ing args )Car aCar = new Trash_Car( );aCar. push_break( );在這里, 類(lèi)Trash_Car中的push_break( )方法將被調(diào)用。2、Java中的類(lèi)、方法和變量中的類(lèi)、方法和變量重寫(xiě)重寫(xiě)方法重寫(xiě)時(shí)應(yīng)遵循的原則 (1)重寫(xiě)后的方法不能比被重寫(xiě)的方法有更嚴(yán)格的訪問(wèn)權(quán)限。 (2)重寫(xiě)后的方法不能比被重寫(xiě)的方法產(chǎn)生更多的例外。2、Java中的類(lèi)、方法和變量中的類(lèi)、方法和變量重寫(xiě)重寫(xiě)例: wash the shirt wash the car wash the dog我們通過(guò)判斷被我們通過(guò)判斷被wash的物體知道該用哪種方法來(lái)的物體知道該用哪種
23、方法來(lái)washq早期語(yǔ)言,比如早期語(yǔ)言,比如C語(yǔ)言,不同的函數(shù)不能通用,導(dǎo)致語(yǔ)言,不同的函數(shù)不能通用,導(dǎo)致 shirtWash(shirt) carWash(car) dogWash(dog)2、Java中的類(lèi)、方法和變量中的類(lèi)、方法和變量重載重載 類(lèi)方法的重載類(lèi)方法的重載 方法重載即指多個(gè)方法可以享有相同的名字。但是方法重載即指多個(gè)方法可以享有相同的名字。但是這些方法的這些方法的參數(shù)必須不同參數(shù)必須不同,或者是參數(shù)個(gè)數(shù)不同,或,或者是參數(shù)個(gè)數(shù)不同,或者是參數(shù)類(lèi)型不同。者是參數(shù)類(lèi)型不同。2、Java中的類(lèi)、方法和變量中的類(lèi)、方法和變量重載重載q 例如,要打印不同類(lèi)型的數(shù)據(jù),int, float
24、, String,不需要定義不同名的方法: printInt(int); printFloat(float); printString(String)。q 利用方法重載,只需要定義一個(gè)方法名:println(),接收不同的參數(shù): println(int); println(float); println(String);例:例:class Washvoid wash(Cloth shirt) void wash (Auto car) void wash (Animal dog,int n) 2、Java中的類(lèi)、方法和變量中的類(lèi)、方法和變量重載重載動(dòng)態(tài)綁定:動(dòng)態(tài)綁定:例:調(diào)用例:調(diào)用wash方法
25、,所有名字為方法,所有名字為wash的方法都會(huì)被找出的方法都會(huì)被找出來(lái)。來(lái)。 wash (Cloth shirt) wash (Auto car) wash (Animal dog,int n)2、編譯器根據(jù)調(diào)用時(shí)的實(shí)參值,選擇所調(diào)用的方法,例:、編譯器根據(jù)調(diào)用時(shí)的實(shí)參值,選擇所調(diào)用的方法,例:wash(benz)2、Java中的類(lèi)、方法和變量中的類(lèi)、方法和變量動(dòng)態(tài)綁定動(dòng)態(tài)綁定 多態(tài)性類(lèi)方法的重載是一種多態(tài)性。除此之外,多態(tài)性還可以是指在程序中需要使用父類(lèi)對(duì)象的地方,都可以用子類(lèi)對(duì)象來(lái)代替。2、Java中的類(lèi)、方法和變量中的類(lèi)、方法和變量多態(tài)性多態(tài)性例如:public class Employ
26、ee extends Object public class Manager extends Employee 則:Employee e = new Manager(); /合通過(guò) instanceof 可以判斷所引用的對(duì)象實(shí)例的實(shí)際類(lèi)型??梢杂梅椒▉?lái)實(shí)現(xiàn)對(duì)成員變量的隱藏:q 設(shè)置變量方法:setVariable()q 獲取變量方法:getVariable()class Sampleprotected int x;void setX(int var ) x = var;int getX() return x; 2、Java中的類(lèi)、方法和變量中的類(lèi)、方法和變量成員變量的隱藏成員變量的隱藏在Jav
27、a語(yǔ)言中,提供了操作符instanceof用來(lái)判斷對(duì)象是否屬于某個(gè)類(lèi)的實(shí)例。public void method (Employee e) if ( e instanceof Manager ) /do something as a Manager else if ( e instanceof Contractor ) /do something as a Contractor else /do something else 2、Java中的類(lèi)、方法和變量中的類(lèi)、方法和變量對(duì)象狀態(tài)的確定對(duì)象狀態(tài)的確定EmployeeManagerContractor2、Java中的類(lèi)、方法和變量中的類(lèi)、方法和
28、變量?jī)?nèi)嵌類(lèi)(內(nèi)嵌類(lèi)(inner class)在一個(gè)類(lèi)的內(nèi)部聲明的類(lèi),稱(chēng)為內(nèi)嵌類(lèi)。public class S int a=10; ./code for Ss methods public void p() return new T(); class T int c =a+ 10; public boolean h () return (c = 0); 內(nèi)嵌類(lèi)只能在包含它的類(lèi)中使用,同時(shí)它可以看作是該包含類(lèi)的一段特殊代碼,可以直接使用該包含類(lèi)的變量和方法。 內(nèi)嵌類(lèi)編譯后也會(huì)形成一個(gè)單獨(dú)的class,但它附屬于其包含類(lèi)。3、Java名字空間及訪問(wèn)規(guī)則名字空間及訪問(wèn)規(guī)則 -Java的修飾符的修飾符n
29、每個(gè)類(lèi)都擁有自己的名字空間,即指類(lèi)及其方法每個(gè)類(lèi)都擁有自己的名字空間,即指類(lèi)及其方法和變量可以使用的范圍即作用域,通過(guò)修飾符完和變量可以使用的范圍即作用域,通過(guò)修飾符完成這種限定。對(duì)類(lèi)而言:成這種限定。對(duì)類(lèi)而言:nabstract類(lèi):不能直接產(chǎn)生屬于這個(gè)類(lèi)的對(duì)象;類(lèi):不能直接產(chǎn)生屬于這個(gè)類(lèi)的對(duì)象;npublic類(lèi):不但可以被同一程序包類(lèi):不但可以被同一程序包(package)中的中的其它類(lèi)使用,別的程序包中的類(lèi)也可以使用;其它類(lèi)使用,別的程序包中的類(lèi)也可以使用;nfriendly類(lèi)類(lèi)(缺省,缺省,包訪問(wèn)類(lèi)包訪問(wèn)類(lèi)):只能被本程序包中的:只能被本程序包中的其它類(lèi)使用,不能被別的程序包中的類(lèi)使用。
30、其它類(lèi)使用,不能被別的程序包中的類(lèi)使用。nfinal類(lèi):不能被其他任何類(lèi)所繼承類(lèi):不能被其他任何類(lèi)所繼承(安全的考慮安全的考慮);n當(dāng)一個(gè)類(lèi)可以被訪問(wèn)時(shí),對(duì)類(lèi)內(nèi)的當(dāng)一個(gè)類(lèi)可以被訪問(wèn)時(shí),對(duì)類(lèi)內(nèi)的成員變量成員變量和和成員方成員方法法而言,其作用域可以通過(guò)不同的修飾詞施以限定。而言,其作用域可以通過(guò)不同的修飾詞施以限定。3、Java名字空間及訪問(wèn)規(guī)則名字空間及訪問(wèn)規(guī)則 private: public: protected: friendly(default,前邊沒(méi)有修飾字的情況,前邊沒(méi)有修飾字的情況):a.privatea.private我是自私的我是自私的 ,別碰我別碰我!私有變量或私有方法只能在
31、私有變量或私有方法只能在定義它的類(lèi)中使用定義它的類(lèi)中使用class Sundae class Sundae private private Sundae() Sundae() static Sundae makeASundae() static Sundae makeASundae() return new Sundae(); return new Sundae(); public class IceCream public class IceCream public static void main(String args) public static void main(String ar
32、gs) Sundae x = new Sundae();/ Sundae x = new Sundae();/errorerror Sundae x = Sundae.makeASundae(); Sundae x = Sundae.makeASundae(); a.privatea.privateclass Sundae class Sundae private Sundae() private Sundae() static Sundae makeASundae() static Sundae makeASundae() return new Sundae(); return new Su
33、ndae(); public static void main(String args) public static void main(String args) Sundae x = new Sundae();/okSundae x = new Sundae();/ok Sundae x = Sundae.makeASundae(); Sundae x = Sundae.makeASundae(); a.privatea.private n b.publicb.public公有變量或公有方法在公有變量或公有方法在任何其它類(lèi)中都可以任何其它類(lèi)中都可以訪問(wèn)訪問(wèn)我有,你有,我有,你有,全都有全都有
34、!package c05.dessert;package c05.dessert; public class Cookie public class Cookie public public Cookie() Cookie() System.out.println(Cookie constructor); System.out.println(Cookie constructor); voidvoid bite() System.out.println(bite); bite() System.out.println(bite); 同一個(gè)包、不同一個(gè)包、不同的包中的類(lèi)同的包中的類(lèi)import
35、c05.dessert.import c05.dessert.* *; ; public class Dinner public class Dinner public Dinner() public Dinner() System.out.println( System.out.println( Dinner constructor); Dinner constructor); public static void main(String args) public static void main(String args) Cookie x = new Cookie(); Cookie x
36、= new Cookie(); x.bite(); x.bite(); / Cant access / Cant access b.publicb.public 不用修飾符修飾的變量和方法稱(chēng)為友好變量和不用修飾符修飾的變量和方法稱(chēng)為友好變量和友好方法友好方法, ,可以在可以在同一包中的不同類(lèi)之間同一包中的不同類(lèi)之間訪問(wèn)訪問(wèn)c.friendlypackage c05.dessert;package c05.dessert; public class Cookie public class Cookie public public Cookie() Cookie() System.out.prin
37、tln(Cookie constructor); System.out.println(Cookie constructor); void void bite() System.out.println(bite); bite() System.out.println(bite); 有事您有事您call我,誰(shuí)我,誰(shuí)讓咱們是朋友呢讓咱們是朋友呢!package c05.dessert;package c05.dessert;public class Dinner public class Dinner public Dinner() public Dinner() System.out.print
38、ln( System.out.println( Dinner constructor); Dinner constructor); public static void main(String args) public static void main(String args) Cookie x = new Cookie(); Cookie x = new Cookie(); x.bite(); / Can access x.bite(); / Can access tected tected 當(dāng)子類(lèi)和父類(lèi)不在同一個(gè)包時(shí),子類(lèi)可以訪問(wèn)
39、父類(lèi)當(dāng)子類(lèi)和父類(lèi)不在同一個(gè)包時(shí),子類(lèi)可以訪問(wèn)父類(lèi)中的中的protected成員成員package c05.dessert;package c05.dessert; public class Cookie public class Cookie public public Cookie() Cookie() System.out.println(Cookie constructor); System.out.println(Cookie constructor); void void bite() System.out.println(bite); bite() System.out.print
40、ln(bite); 我真想獨(dú)立,摸我真想獨(dú)立,摸 摸摸兜里沒(méi)有多少錢(qián)兜里沒(méi)有多少錢(qián)!如果兩個(gè)類(lèi)是繼承關(guān)系,如果兩個(gè)類(lèi)是繼承關(guān)系,protectedprotected就相就相當(dāng)于當(dāng)于public,public,否則相當(dāng)于否則相當(dāng)于friendlyfriendlyimport c05.dessert.import c05.dessert.* *; ; public class ChocolateChip extends Cookie public class ChocolateChip extends Cookie public ChocolateChip() public ChocolateCh
41、ip() System.out.println(ChocolateChip constructor); System.out.println(ChocolateChip constructor); public static void main(String args) public static void main(String args) ChocolateChip x = new ChocolateChip(); ChocolateChip x = new ChocolateChip(); x.bite(); / Cant access bite x.bite(); / Cant acc
42、ess bite tectedpackage c05.dessert;package c05.dessert; public class Cookie public class Cookie public Cookie() public Cookie() System.out.println(Cookie constructor); System.out.println(Cookie constructor); Protected Protected void bite() void bite() System.out.println(bite); System
43、.out.println(bite); tectedimport c05.dessert.import c05.dessert.* *; ; public class ChocolateChip extends Cookie public class ChocolateChip extends Cookie public ChocolateChip() public ChocolateChip() System.out.println(ChocolateChip constructor); System.out.println(ChocolateChip con
44、structor); public static void main(String args) public static void main(String args) ChocolateChip x = new ChocolateChip(); ChocolateChip x = new ChocolateChip(); x.bite(); / Can access bite x.bite(); / Can access bite tectedn例:例:class Tomclass Tomn public String name; public String
45、name;n private float wage; private float wage;n int age; int age; n class Jerryclass Jerryn void g()void g()n Tom cat=new Tom(); Tom cat=new Tom();n ==“jittyjitty”;/;/合法合法/ /n cat.wage=4300.00f;/cat.wage=4300.00f;/不合法不合法/ /n cat.age=34;/ cat.age=34;/若若TomTom和和JerryJerry的的n 在同一包中是合法的在
46、同一包中是合法的/ /方法和變量是一樣的方法和變量是一樣的3、Java名字空間及訪問(wèn)規(guī)則名字空間及訪問(wèn)規(guī)則 同一個(gè)類(lèi)中同一個(gè)類(lèi)中 同一個(gè)包中同一個(gè)包中 不同包中的子類(lèi)不同包中的子類(lèi) 不同包中的非子類(lèi)(任意類(lèi))不同包中的非子類(lèi)(任意類(lèi))privateprivatedefaultdefaultprotectedprotectedpublicpublicn當(dāng)子類(lèi)中的變量名與父類(lèi)的相同,父類(lèi)的變量被遮蓋當(dāng)子類(lèi)中的變量名與父類(lèi)的相同,父類(lèi)的變量被遮蓋。class A int data_a=3; 3、Java名字空間及訪問(wèn)規(guī)則名字空間及訪問(wèn)規(guī)則class B extends A int data_a =
47、5;class C extends B void print_out() System.out.println(“data_a= ”+data_a); class demo public static void main(String args) C c = new C(); c.print_out(); data_a=53、Java名字空間及訪問(wèn)規(guī)則名字空間及訪問(wèn)規(guī)則 final:到此為止:到此為止nfinal在類(lèi)之前在類(lèi)之前n表示該類(lèi)是最終類(lèi),不能再被繼承。表示該類(lèi)是最終類(lèi),不能再被繼承。nfinal在方法之前在方法之前n表示該方法是最終方法,該方法不能被任何表示該方法是最終方法,該方法不
48、能被任何派生的子類(lèi)重寫(xiě)。派生的子類(lèi)重寫(xiě)。nfinal在變量之前在變量之前n表示變量的值在初始化之后就不能再改變;表示變量的值在初始化之后就不能再改變;相當(dāng)于定義了一個(gè)常量。相當(dāng)于定義了一個(gè)常量。static 在變量或方法之前,稱(chēng)為類(lèi)方法(靜態(tài)方法)在變量或方法之前,稱(chēng)為類(lèi)方法(靜態(tài)方法)或類(lèi)變量(靜態(tài)變量)。若無(wú)或類(lèi)變量(靜態(tài)變量)。若無(wú)static修飾,則是實(shí)修飾,則是實(shí)例方法和實(shí)例變量。例方法和實(shí)例變量。對(duì)象共享靜態(tài)變量的存貯空間對(duì)象共享靜態(tài)變量的存貯空間class Ex char data; static int s_data;class Demo Ex a,b,c,d; 3、Java名
49、字空間及訪問(wèn)規(guī)則名字空間及訪問(wèn)規(guī)則 static:類(lèi)變量和類(lèi)方法:類(lèi)變量和類(lèi)方法a=new Ex();b=new Ex();c=new Ex();d=new Ex();a dataa s_data b datac datad data,d,c,b類(lèi)變量的生存期不依賴(lài)于對(duì)象,相當(dāng)于C語(yǔ)言中全局變量的作用。通過(guò)類(lèi)名訪問(wèn)它們。public class StaticVarpublic static int number 5;public class OtherClasspublic void method() int x = StaticVar.number;3、Java名字空間及訪問(wèn)規(guī)則名字空間及訪
50、問(wèn)規(guī)則 static:類(lèi)變量和類(lèi)方法:類(lèi)變量和類(lèi)方法類(lèi)方法類(lèi)方法則相當(dāng)于C語(yǔ)言中的全局函數(shù),其他的類(lèi)也可以直接通過(guò)類(lèi)名來(lái)訪問(wèn)類(lèi)方法。(Java程序的入口方法main()就是一個(gè)類(lèi)方法)public class GeneralFunctionpublic static int addUp(int x,int y)return x+y;public class UseGeneralpublic void method()int a = 9;int b =10;int c = GeneralFunction.addUp(a,b);3、Java名字空間及訪問(wèn)規(guī)則名字空間及訪問(wèn)規(guī)則 static:類(lèi)變量
51、和類(lèi)方法:類(lèi)變量和類(lèi)方法注意:注意:1. 同一個(gè)類(lèi)的實(shí)例方法可以訪問(wèn)同一個(gè)類(lèi)的實(shí)例方法可以訪問(wèn)該類(lèi)的類(lèi)變量和類(lèi)方法;該類(lèi)的類(lèi)變量和類(lèi)方法;3、Java名字空間及訪問(wèn)規(guī)則名字空間及訪問(wèn)規(guī)則 static:類(lèi)變量和類(lèi)方法:類(lèi)變量和類(lèi)方法 討論:鑒于類(lèi)變量和類(lèi)方法的這種存貯討論:鑒于類(lèi)變量和類(lèi)方法的這種存貯特性和訪問(wèn)特性,什么樣的方法和變量設(shè)特性和訪問(wèn)特性,什么樣的方法和變量設(shè)計(jì)成靜態(tài)更合適呢?計(jì)成靜態(tài)更合適呢?2.而類(lèi)方法只能訪問(wèn)該類(lèi)的類(lèi)變量和類(lèi)而類(lèi)方法只能訪問(wèn)該類(lèi)的類(lèi)變量和類(lèi)方法,不能直接訪問(wèn)實(shí)例的變量和方法。方法,不能直接訪問(wèn)實(shí)例的變量和方法。 不正確的引用class StaticError
52、String mystring=“hello”; public static void main(String args) System.out.println(mystring); 3、Java名字空間及訪問(wèn)規(guī)則名字空間及訪問(wèn)規(guī)則 static:類(lèi)變量和類(lèi)方法:類(lèi)變量和類(lèi)方法編譯時(shí)錯(cuò)誤信息: nonstatic variable mystring cannot be referenced from a static context “System.out.println(mystring);”。為什么不正確:靜態(tài)方法訪問(wèn)了非靜態(tài)變量為什么不正確:靜態(tài)方法訪問(wèn)了非靜態(tài)變量。n解決的辦法1. 將
53、變量改成類(lèi)變量將變量改成類(lèi)變量class NoStaticError static String mystring=“hello”; public static void main(String args) System.out.println(mystring); 3、Java名字空間及訪問(wèn)規(guī)則名字空間及訪問(wèn)規(guī)則 static:類(lèi)變量和類(lèi)方法:類(lèi)變量和類(lèi)方法n解決的辦法2. 先創(chuàng)建一個(gè)類(lèi)的實(shí)例先創(chuàng)建一個(gè)類(lèi)的實(shí)例class NoStaticError String mystring=“hello”; public static void main(String args) NoStaticEr
54、ror noError; noError = new NoStaticError(); System.out.println(noError.mystring); 3、Java名字空間及訪問(wèn)規(guī)則名字空間及訪問(wèn)規(guī)則 static:類(lèi)變量和類(lèi)方法:類(lèi)變量和類(lèi)方法4、Java中的抽象類(lèi)、接口和程序包中的抽象類(lèi)、接口和程序包抽象類(lèi)與抽象方法抽象類(lèi)與抽象方法n抽象類(lèi):用abstract關(guān)鍵字來(lái)修飾一個(gè)類(lèi)時(shí),該類(lèi)叫做抽象類(lèi);n抽象類(lèi)必須被繼承。n抽象類(lèi)不能被直接實(shí)例化。它只能作為其它類(lèi)的超類(lèi),這一點(diǎn)與最終類(lèi)(final類(lèi))正好相反。n抽象方法:用abstract來(lái)修飾一個(gè)方法時(shí),該方法叫做抽象方法。n抽象
55、方法必須被重寫(xiě)n抽象方法只有聲明,不能有實(shí)現(xiàn)。n定義了抽象方法的類(lèi)必須是抽象類(lèi)。nabstract returnType abstractMethod ( paramlist ); 兩個(gè)類(lèi)Circle和Rectangle,完成相關(guān)參數(shù)的計(jì)算 class Rectangle public float width,height; Rectangle (float w, float h) width = w; /這里不需這里不需this height = h; public float area() return width*height; class Circle public float r;
56、Circle(float r) this.r = r; /this指指這個(gè)對(duì)象的這個(gè)對(duì)象的 public float area() return 3.14*r*r; 4、Java中的抽象類(lèi)、接口和程序包中的抽象類(lèi)、接口和程序包抽象類(lèi)與抽象方法抽象類(lèi)與抽象方法n假設(shè)有若干個(gè)Circle,以及若干個(gè)Rectangle,希望計(jì)算它們的總面積,直截了當(dāng)?shù)淖龇ㄊ菍⑺鼈兎謩e放到兩個(gè)數(shù)組中,用兩個(gè)循環(huán),用加法,這種做法是不漂亮的。4、Java中的抽象類(lèi)、接口和程序包中的抽象類(lèi)、接口和程序包抽象類(lèi)與抽象方法抽象類(lèi)與抽象方法n如果還有其它形狀:Triangle,Ellipses等,上述方法更顯得“累贅”。n我們
57、希望有一種統(tǒng)一的表示,例如用一個(gè)數(shù)組shape,接受所有的形狀,然后用:for (i=0; ishape.length; i+) area_total += shapei.area();abstract class Shape abstract float area();class Rectangle extends Shape public float width,height; Rectangle (float w, float h) width = w; /這里不需這里不需this height = h; public float area() return width*height;
58、class Circle extends Shape public float r; Circle(float r) this.r = r; /this指指這個(gè)對(duì)象的這個(gè)對(duì)象的 public float area() return 3.14*r*r; 4、Java中的抽象類(lèi)、接口和程序包中的抽象類(lèi)、接口和程序包抽象類(lèi)與抽象方法抽象類(lèi)與抽象方法 接口(接口(interface)就是方法定義和常量值的集合。)就是方法定義和常量值的集合。從本質(zhì)上講,接口是一種特殊的抽象類(lèi),這種抽象類(lèi)從本質(zhì)上講,接口是一種特殊的抽象類(lèi),這種抽象類(lèi)中只包含常量和方法的定義,而沒(méi)有方法的實(shí)現(xiàn)。中只包含常量和方法的定義,而
59、沒(méi)有方法的實(shí)現(xiàn)。4、Java中的抽象類(lèi)、接口和程序包中的抽象類(lèi)、接口和程序包接口接口接口的定義:接口的定義:public interface interfaceName extends SuperInterfaceList /常量定義和方法定義interface Collectionint MAX_NUM=100;void add (Object obj);void delete (Object obj);Object find (Object obj);int currentCount ( );4、Java中的抽象類(lèi)、接口和程序包中的抽象類(lèi)、接口和程序包 接口接口例:接口的定義例:接口的定義
60、1. 用implements子句來(lái)表示一個(gè)類(lèi)使用某個(gè)接口。4、Java中的抽象類(lèi)、接口和程序包中的抽象類(lèi)、接口和程序包接口的使用接口的使用3. 在類(lèi)體中可以使用接口中定義的常量,而且必須實(shí)現(xiàn)接口中定義的所有方法。 2.利用接口可實(shí)現(xiàn)多重 繼承,即一個(gè)類(lèi)可以使用多個(gè)接口,在implements子句中用逗號(hào)分隔。 4.接口的作用和抽象類(lèi)相似,只定義原型,不直接定義方法的內(nèi)容。5. 接口中的方法和變量必須是public的。interface Collectionint MAX_NUM=100;void add (Object obj);void delete (Object obj);Object
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年海南從業(yè)資格證貨運(yùn)題庫(kù)答案
- 電力損耗管理合同(2篇)
- 晉教版地理七年級(jí)下冊(cè)9.5《極地地區(qū)──冰封雪裹的世界》聽(tīng)課評(píng)課記錄
- 小學(xué)五年級(jí)下冊(cè)數(shù)學(xué)《同分母分?jǐn)?shù)加減法》聽(tīng)評(píng)課記錄
- 2024年春五年級(jí)語(yǔ)文下冊(cè)第一單元3冬不拉課文原文素材語(yǔ)文S版
- 2024-2025學(xué)年高中政治課時(shí)分層作業(yè)19培育和踐行社會(huì)主義核心價(jià)值觀含解析新人教版必修3
- 2024-2025學(xué)年新教材高中地理第一單元從宇宙看地球第一節(jié)地球的宇宙環(huán)境第1課時(shí)宇宙和太陽(yáng)課后篇鞏固提升含解析魯教版必修第一冊(cè)
- 專(zhuān)業(yè)技術(shù)人員年終工作總結(jié)
- 初中歷史社團(tuán)活動(dòng)總結(jié)
- 教師戶(hù)外活動(dòng)總結(jié)
- 《中小學(xué)校園食品安全和膳食經(jīng)費(fèi)管理工作指引》專(zhuān)題講座
- 2024統(tǒng)編版新教材道德與法治七年級(jí)全冊(cè)內(nèi)容解讀課件(深度)
- 成人氧氣吸入療法-中華護(hù)理學(xué)會(huì)團(tuán)體標(biāo)準(zhǔn)
- 孫權(quán)勸學(xué)教案全國(guó)一等獎(jiǎng)教學(xué)設(shè)計(jì)
- 企業(yè)生產(chǎn)現(xiàn)場(chǎng)6S管理知識(shí)培訓(xùn)課件
- 五年級(jí)下冊(cè)數(shù)學(xué)課件 第10課時(shí) 練習(xí)課 蘇教版(共11張PPT)
- 電梯口包邊施工方案正式
- 三年級(jí)道德與法治下冊(cè)我是獨(dú)特的
- 土木工程畢業(yè)設(shè)計(jì)(論文)-五層宿舍樓建筑結(jié)構(gòu)設(shè)計(jì)
- 青年卒中 幻燈
- 典型倒閘操作票
評(píng)論
0/150
提交評(píng)論