第三章面向?qū)ο蟪绦蛟O(shè)計基礎(chǔ)(2)_第1頁
第三章面向?qū)ο蟪绦蛟O(shè)計基礎(chǔ)(2)_第2頁
第三章面向?qū)ο蟪绦蛟O(shè)計基礎(chǔ)(2)_第3頁
第三章面向?qū)ο蟪绦蛟O(shè)計基礎(chǔ)(2)_第4頁
第三章面向?qū)ο蟪绦蛟O(shè)計基礎(chǔ)(2)_第5頁
已閱讀5頁,還剩71頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、接口與包接口與包什么是包(什么是包( package )l包的作用類似于C的函數(shù)庫,但是C的函數(shù)庫很容易出現(xiàn)重名的問題,包在一定程度上解決了這個問題。l一個包通常包含很多個功能相近的類。lJDK里面已經(jīng)包含了N個功能強大的包,所以當(dāng)你要實現(xiàn)一個功能,首先記得去查一下JDK的文檔,看看有否對應(yīng)功能的包。l編程語言的優(yōu)劣都是相對而言的,大家覺得Java功能很強大,其實是因為SUN公司的JDK免費贈送了眾多功能強大的包。包包1l包的命名lSUN公司建議用域名的逆序,因為域名是唯一的。如:.xmul包的結(jié)構(gòu)l一個包被映射為一個目錄,包里面的每個類,則映射到目錄中的某一個文件,如:com.p

2、renhall.mypackage這個包被展開后,就是包包2l打包lpackage packagename;l上面這一行一般出現(xiàn)在Java源文件的第一行,表示這個文件的所有類,都將被打包到packagename中。l不同源文件的packagename可以相同,Java會根據(jù)packagename將相同包的class壓縮在一起,生成一個擴展名為jar的包。l順便說一下,jar包其實是zip格式的壓縮文件包包3l使用包l要使用一個包里的某個類,必須首先導(dǎo)入limport javax.swing.JOptionPane;l如果要使用一個包里的多個類,用這個limport javax.swing.*;

3、l*表示導(dǎo)入這個包的所有類l注意包之間沒有嵌套關(guān)系,例如java.awt和java.awt.geom是兩個完全獨立的包。這個其實很好理解,因為java.awt這個包,僅僅包含java/awt這個目錄下的class文件,而java/awt/geom則是另外一個目錄了。包的命名規(guī)范包的命名規(guī)范l包的名稱一般全部采用小寫l包名的前綴一般是域名單詞序列的逆序l實例lcom.sun.englcom.apple.quicktimeledu.cmu.cs.bovik.cheese文件的命名規(guī)范文件的命名規(guī)范l必須與該文件中public類的類名同名l后綴必須是 .java類類/接口的命名規(guī)范接口的命名規(guī)范l類

4、名一般是名詞/名詞詞組:每個單詞的首字母大寫,其它字母小寫l類名應(yīng)當(dāng)盡量簡單,而且其含義能夠盡量準(zhǔn)確地刻畫該類的含義l一般采用全稱盡量少用縮寫詞 (除非該縮寫詞被廣泛使用)l實例lClocklTimelImageSprite方法的命名規(guī)范方法的命名規(guī)范l方法名一般是l動詞/動詞性詞組l首字母小寫l中間單詞的首字母大寫,其它字母小寫l盡量應(yīng)用簡單的、常用的單詞l實例lrun( );lgetBackground( );lgetTime( );變量的命名規(guī)范變量的命名規(guī)范l變量名的首字母小寫l中間單詞的首字母大寫,其它字母小寫l變量名的首字母盡量不要用字符: _ 或 $l變量名應(yīng)當(dāng)簡短、有含義、且便

5、于記憶l變量名常常由表示其所扮演的角色與數(shù)據(jù)類型組成l實例lint i; char c; double widthBox;lPoint startingPoint, centerPoint;lName loginName;常量的命名規(guī)范常量的命名規(guī)范l常量名一般全大寫,單詞之間用下劃線分隔 (“_”)l實例:lstatic final int MIN_WIDTH = 4;lstatic final int MAX_WIDTH = 999;源文件編輯源文件編輯l盡量不要用TAB排版l行數(shù)/每行的字符數(shù)不宜過多l(xiāng)縮排方式(Indentation)l多用空白符/行l(wèi)友情提示:通常Java的開發(fā)環(huán)境都

6、會提供源代碼的格式化/重排功能,如果使用記事本編輯源代碼,建議去下載一個叫astyle的源代碼重排工具(DOS命令行工具)。UltraEdit有捆綁這個工具,并提供了GUI界面的調(diào)用方式。文件組織文件組織l源程序文件一般采用如下的組織順序:l最開始一般是注釋lpackage 和 import 語句l類和接口的定義搞一個復(fù)雜一點的例子先熱身搞一個復(fù)雜一點的例子先熱身l我們想做一個類Circle表示平面直角坐標(biāo)系上的一個圓(解析幾何還記得吧.)。l然后我們想做一個求面積的成員函數(shù)。l我們還要假定所有的Circle的成員變量都是private的,所有的成員函數(shù)都是public的,下面開始動手設(shè)計這個

7、類。操作步驟操作步驟 1l先搭一個空架子總是沒有問題的:class Circle操作步驟操作步驟 2l設(shè)計一下成員變量,這里三個足夠了:class Circle private double r; /r是半徑 private double x,y; /(x,y)是圓心坐標(biāo)操作步驟操作步驟 3l然后是構(gòu)造函數(shù),這里先搞兩個:class Circle private double r; private double x,y; public Circle() x=0; y=0; r=1; public Circle(double x, double y, double r) this.x=x; th

8、is.y=y; this.r=r; /一不小心用到了this,阿門,this是啥知道不? 操作步驟操作步驟 4l然后是面積函數(shù):class Circle private double r; private double x,y; public Circle() x=0; y=0; r=1; public Circle(double x, double y, double r) this.x=x; this.y=y; this.r=r; public double getArea() return (Math.PI*r*r); Eclipse測試程序測試程序l綜合一下以上的所有步驟:l先建一個工

9、程,名字隨意,再建一個類,名字叫Circle,然后把Circle的代碼貼上;l再建一個類,名字隨意,例如叫Test,勾上自動生成main函數(shù)的選項;l現(xiàn)在你的工程里應(yīng)該有兩個java源文件,兩個類,其中一個是用來測試的類,所以它有main函數(shù),Circle類由于沒有main函數(shù),所有它是不能運行的。因此啟動運行的主類是Test。Test類的寫法類的寫法public class Testpublic static void main(String args) Circle c1 = new Circle();System.out.println(c1.getArea();Circle c2 =

10、new Circle(3.0,4.0,5.0);System.out.println(c2.getArea();Circle的改進(jìn)的改進(jìn)lCircle類顯然不完善,例如你在Test類里,如果想知道c1的x,y,r三個成員分別是多少,可能嗎?如果你想在Test類里,隨時修改c1的半徑,可能嗎?l答案顯然不行,所以,Circle其實還有很多的成員函數(shù)需要添加。l這里就不演示了,自己動手試試。研究一下對象的引用研究一下對象的引用l一個類的成員函數(shù)(static除外),是不是一定要new才能被使用呢?例如GUI編程中經(jīng)常有這種語句:lContainer container = getContentPa

11、ne(); container.add(new Button(hello button);l這個container好像就沒有new對吧?怎么就可以抓來用呢?難道隨便get一下也能用?l其實這個container已經(jīng)被new過了,只是你沒有看見而已。get一下相當(dāng)于做對象的引用。這么說好像很復(fù)雜,看一個例子:對象的引用對象的引用 Iclass A public int x;public class Testpublic static void main(String args) A a = new A(); a.x = 1; System.out.println(a.x=+a.x); A b =

12、 a; /注意這里注意這里b不是不是new出來的出來的 b.x = 10; System.out.println(b.x=+b.x); System.out.println(a.x=+a.x); a.x = 100; System.out.println(a.x=+a.x); System.out.println(b.x=+b.x);這個例子的輸出是:a.x=1b.x=10a.x=10a.x=100b.x=100對象的引用對象的引用 IIl總結(jié)一下,如果一個對象不是new出來的(例子中的b),而是直接用一個已經(jīng)new出來的對象(例子中的a)給它賦值,那么這個對象b就叫做a的引用。l引用的對象之

13、所以可以使用,不需要new,其實是因為它所指向的對象和賦值給它的對象是同一個它所指向的對象和賦值給它的對象是同一個!也就是它只是給原來的對象又起了一個名字而已。l順便再提一次,對象作為函數(shù)參數(shù)的時候,實參都是通過引用傳遞引用傳遞的方式傳給形參的。再談多態(tài)性再談多態(tài)性當(dāng)繼承發(fā)生的時候,多態(tài)性就來了當(dāng)繼承發(fā)生的時候,多態(tài)性就來了方法覆蓋方法覆蓋l當(dāng)子類和超類定義了同樣的函數(shù)時,就產(chǎn)生了方法覆蓋,如:public class Circle extends GeometricObject /* Override the toString method defined in GeometricObjec

14、t */ public String toString() return super.toString() + nradius is + radius; l當(dāng)覆蓋發(fā)生時,在子類中,超類中的函數(shù)會被自動屏蔽;如果非要調(diào)用超類的函數(shù),只能借助于super關(guān)鍵字。覆蓋和重載是不同的覆蓋和重載是不同的l下圖中的函數(shù)p,左邊是覆蓋,右邊是重載l覆蓋的特征:函數(shù)名相同,參數(shù)列表相同l重載的特征:函數(shù)名相同,參數(shù)列表不同來一個例子來一個例子class A protected int x; public void f() x-; class B extends A int x; void f() /覆蓋了超類

15、的覆蓋了超類的f() this.x+; /這里用的是自己的這里用的是自己的x,也可以直接寫,也可以直接寫x+ super.x = 100; /這里用的是超類繼承來的這里用的是超類繼承來的x super.f(); /這里用的是超類繼承來的這里用的是超類繼承來的f() void f(int i) /重載了繼承來的函數(shù)重載了繼承來的函數(shù)f(),注意二者的參數(shù)列表不同,注意二者的參數(shù)列表不同 i+; 有個復(fù)雜點的例子有個復(fù)雜點的例子class A void fun() System.out.println(“A”); class B extends A void fun() System.out.pr

16、intln(“B”); class C extends B void fun() System.out.println(“C”); class Test public static void main(String args) A a; B b = new B(); C c = new C(); a=b; a.fun(); / 此處將輸出Ba=c; a.fun(); / 此處將輸出C 解釋一下解釋一下lJava 的動態(tài)多態(tài)性這種機制遵循一個原則:當(dāng)超類(父類)對象的引用變量引用子類對象時,被引用對象的類型而不是引用變量的類型決定了調(diào)用誰的成員方法;l當(dāng)然,這個被調(diào)用的方法必須是必須是在超類中定

17、義過的,也就是說被子類覆蓋的方法。你可能會問,如果這個方法沒有被覆蓋呢?Good question還有個例子還有個例子class A void fun() System.out.println(“A”); class B extends A void funB() System.out.println(“B”); class C extends B void funC() System.out.println(“C”); class Test public static void main(String args) A a; B b = new B(); C c = new C(); a=b;

18、 a.fun(); / 此處將輸出Aa=c; a.fun(); / 此處將輸出A 從編程角度來看抽象類從編程角度來看抽象類抽象類抽象類l假設(shè)我們用GeometricObject這個類作為幾何形狀的基類,以便可以在GeometricObject的基礎(chǔ)上派生出Circle類、Rectangle類等等具體的幾何圖形。l顯然,GeometricObject這個類應(yīng)該包含幾何形狀的一些共性:顏色、是否填充、創(chuàng)建日期、toString()函數(shù)、可以被求周長、可以被求面積l下面我們來設(shè)計這個類:面積和周長的困惑面積和周長的困惑l顏色、是否填充、創(chuàng)建日期等函數(shù)不難寫出相應(yīng)的Java代碼。但是這里有兩個函數(shù)是沒

19、法寫代碼的,這就是面積和周長函數(shù)。這是因為面積和周長跟具體形狀有關(guān),在沒有具體的形狀之前,這兩個屬性沒法計算。l現(xiàn)在的問題是,作為一個基類GeometricObject,如果沒有設(shè)計getArea和getPerimeter函數(shù),顯然屬于重大設(shè)計失誤。但是這個函數(shù)又確實沒法寫,怎么辦呢?Java說,好辦,你可以把那兩個函數(shù)做成抽象函數(shù)嘛。抽象函數(shù)抽象函數(shù)l抽象函數(shù)是一種特殊函數(shù),它只定義了函數(shù)原型,但是不需要實現(xiàn)這個函數(shù)。抽象函數(shù)用關(guān)鍵字abstract修飾。l包含抽象函數(shù)的類叫做抽象類,也必須用abstract修飾。l我們現(xiàn)在知道,抽象類只是一個半成品,所以Java中,抽象類不可以被new出來

20、。GeometricObject類的部分代碼類的部分代碼 1 public abstract class GeometricObject 2 private String color = white; 3 private boolean filled; 4 private java.util.Date dateCreated; 5 6 /* Construct a default geometric object */ 7 protected GeometricObject() 8 dateCreated = new java.util.Date(); 9 .43 /* Abstract me

21、thod getArea */44 public abstract double getArea();4546 /* Abstract method getPerimeter */47 public abstract double getPerimeter();48 注意這兩個抽象函數(shù)注意這兩個抽象函數(shù)是沒有函數(shù)體的。是沒有函數(shù)體的。抽象類的派生類抽象類的派生類l剛才看到,抽象類有幾個函數(shù)其實是沒有實現(xiàn)的;于是Java規(guī)定,凡是抽象類的派生類,一定要完成父類的未竟事業(yè)。l例如從GeometricObject類派生兩個類,一個叫做Circle,一個叫做Rectangle。那么這兩個類都一定要覆蓋

22、(實現(xiàn))getArea和getPerimeter函數(shù)。換句話說,這兩個類可以沒有其它成員,但是一定要實現(xiàn)這兩個成員函數(shù)。Circle類的部分代碼類的部分代碼3 public class Circle extends GeometricObject 4 private double radius;.23 /* Return area */24 public double getArea() 25 return radius * radius * Math.PI;26 .33 /* Return perimeter */34 public double getPerimeter() 35 retu

23、rn 2 * radius * Math.PI;36 .43 注意這兩個注意這兩個GeometricObject的抽象函數(shù)在這里一定抽象函數(shù)在這里一定要被實現(xiàn)。要被實現(xiàn)。Rectangle類的部分代碼類的部分代碼 3 public class Rectangle extends GeometricObject 4 private double width; 5 private double height;.35 /* Return area */36 public double getArea() 37 return width * height;38 3940 /* Return perim

24、eter */41 public double getPerimeter() 42 return 2 * (width + height);43 44 注意這兩個注意這兩個GeometricObject的抽象函數(shù)在這里一定抽象函數(shù)在這里一定要被實現(xiàn)。要被實現(xiàn)。抽象類小結(jié)抽象類小結(jié) 抽象函數(shù)只能在抽象類中出現(xiàn),這些抽象函數(shù)在派生類中一定要被實現(xiàn)。 抽象類不能被new出來。 抽象類可以沒有抽象函數(shù),但是即便如此,它也不能被new出來。 即使父類不是抽象類,子類也可以定義成抽象類。 父類中的非抽象函數(shù),可以被子類覆蓋,并修改成抽象函數(shù)。 抽象類不能被new,但是抽象類是一個合法的數(shù)據(jù)類型。如:Geo

25、metricObject objects = new GeometricObject10; 1 public class TestGeometricObject 2 /* Main method */ 3 public static void main(String args) 4 / Declare and initialize two geometric objects 5 GeometricObject geoObject1 = new Circle(5); 6 GeometricObject geoObject2 = new Rectangle(5, 3); 7 8 System.ou

26、t.println(The two objects have the same area? + 9 equalArea(geoObject1, geoObject2);1011 / Display circle12 displayGeometricObject(geoObject1);1314 / Display rectangle15 displayGeometricObject(geoObject2);16 1718 /* A method for comparing the areas of two geometric objects */19 public static boolean

27、 equalArea(GeometricObject object1,20 GeometricObject object2) 21 return object1.getArea() = object2.getArea();22 2324 /* A method for displaying a geometric object */25 public static void displayGeometricObject(GeometricObject object) 26 System.out.println();27 System.out.println(The area is + obje

28、ct.getArea();28 System.out.println(The perimeter is + object.getPerimeter();29 30 一個測試程序一個測試程序特殊抽象類:接口特殊抽象類:接口接口接口1l當(dāng)一個抽象類沒有成員變量,并且其全部函數(shù)都被做成抽象函數(shù)時,Java會建議你使用interface這個關(guān)鍵字來替換class。所以,本質(zhì)上,接口其實是一個抽本質(zhì)上,接口其實是一個抽象類,它的全部函數(shù)都是抽象函數(shù)并且沒有成員變量象類,它的全部函數(shù)都是抽象函數(shù)并且沒有成員變量(可以有靜態(tài)常量)。(可以有靜態(tài)常量)。l接口由于不帶有成員變量,所以它特別適合用來描述一種通用

29、的操作。例如同一個類的兩個實例A、B比較大小這個操作,無論A、B是什么類的實例,你都可以定義AB時,取正值;A=B時,取零;A (ComparableRectangle)o).getArea()11 return 1;12 else if (getArea() 基本類型基本類型l可以使用包裝類的doubleValue, floatValue, intValue, longValue, shortValue函數(shù),從包裝類取出對應(yīng)的基本類型的值。l例如:llong l = doubleObject.longValue(); /有截斷l(xiāng)int i = integerOValue()

30、;數(shù)值包裝類和字符串的轉(zhuǎn)換數(shù)值包裝類和字符串的轉(zhuǎn)換l數(shù)值包裝類 = 字符串ldouble d = 5.9;lDouble doubleObject = new Double(d);lString s = doubleObject.toString();l字符串 = 數(shù)值包裝類lDouble doubleObject = Double.valueOf(1.4);lInteger integerObject = Integer.valueOf(12);字符串字符串 = 基本類型基本類型l/ These two methods are in the Byte classlpublic static byte parseByte(String s)lpublic static byte parseByte(String s, int radix)l/ These two methods are in the Short classlpublic static short parseShort(String s)lpublic static short parseShort(String s, int radix)l/ These two methods are in the Integer classlpublic static int par

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論