1. 程式人生 > >陣列,繼承,過載,多型,抽象,介面,GUI,內部類

陣列,繼承,過載,多型,抽象,介面,GUI,內部類

設計層面的六大原則:

單一職責原則:

一個類只做一件事情,一個方法只做一件事,降低程式碼冗餘,提高程式碼複用性。

不要把無關的事情放到方法中來完成。每個方法不要超過20行,10行為最佳。

最少知道原則:

儘量少公開方法或者屬性,對外只公佈介面。

里氏替換原則:

當基類被派生類替換時,功能不發生改變,所以在使用繼承的時候,儘量不要發生重寫。

用基類定義,用派生類例項化,利用派生類的例項替換基類。

介面隔離原則:

在不違背單一職責原則的情況下,確保一個介面只做一件事情,不要把無關的介面處理通過不同的引數,融入同一個介面。

依賴倒置原則:

高層模組(呼叫)不依賴底層(被呼叫)模組,依賴於抽象而不是具體。

開閉原則:(開放的介面越少越好)

通過訪問修飾符進行訪問控制,只開放必要的介面(方法,函式,行為,動作)給其他類呼叫,封裝起來。

把改動比較頻繁的介面,設為私有,開放出去一個相對穩定的介面。

對外提供查詢,對內不提供修改;對外公佈介面,對內隱藏具體方法實現。

 

 

 

Java註釋

1./** */-類註釋,可以通過javadoc來編譯生成html檔案

2./* */-多行註釋,不可編譯。

3.//-單行註釋,不可編譯。

java陣列

陣列的定義:

int[] array={1};

int[] newArray= new int[10];

String[] sArray= new String[6];

For-each語句 for型別與需要遍歷佇列一致的型別 變數名:佇列名

for(string  s :sArray){

         System.out.println(s);

}

陣列列印

System.out.println(array);//這樣的寫法是錯誤的!

System.out.println(Arrays.toString(array));//正確寫法!

資料轉換可使用Integer方法

int price = 200 * Integer.parseInt(pCount);(將其他資料型別轉換為整型資料型別,使用integer方法下面的一些方法。)

If語句裡面的判斷兩個等號是全等(棧和堆都相等),java裡面可以使用.eauals()這個方法,判斷資料是否相等。

三元表示式:

在表示式boolean-exp ? value0 : value1 中,如果“布林表示式”的結果為true,就計算“value0”,而且這個計算結果也就是操作符最終產生的值。如果“布林表示式”的結果為false,就計算“value1”,同樣,它的結果也就成為了操作符最終產生的值。

int a=1;

int b=2;

int c= a>b?1:0;

 

Java面向物件程式語言設計

面相物件三個特點:

繼承:傳遞性,可覆蓋性,里氏替換原則,單一繼承。

封裝(開啟應用的介面,關閉細節的實現):屬性,行為,訪問修飾符,失血模型,開閉原則,單一職責。

多型:抽象類,介面,過載(靜態多型性),動態多型性)(father f=new son();)

類與物件:

面向物件程式設計(object-oriented programming)

從類到物件:

1.       使用new關鍵字產生一個類的例項

2.       操作的全是物件。

從類到物件會經過4個步驟:

1.       載入

2.       連線

3.       初始化

4.       例項化

從類成為物件有幾種方式:

a)         例項化—強制分配物件(消耗堆記憶體空間,例項的變數名消耗的棧記憶體空間has值,該值是地址,指向對應的堆。)

b)         反射

c)         反序列化

d)         克隆---產生一個新物件,與當前物件一模一樣。

失血模型:只有屬性,沒有行為的類。(資料類)

富血模型:有屬性和行為的類。

方法呼叫:

本類:

靜態呼叫非靜態通過物件直接呼叫。

其他情況都可以直接呼叫,或者使用this關鍵字呼叫。

不同類:

任何地方呼叫靜態程式碼塊可以直接通過類名,也可以通過物件呼叫。

其他的情況都需要通過物件呼叫。

Overload-過載

對於同類中的同名方法只要構成引數列表不一致(引數的數量、型別、不同型別的引數順序的不一致),即形成過載。(只與引數列表有關,與返回值無關)

建構函式(又名構造器,建構函式,constructer):

    是一種特殊的方法。主要用來在建立物件時初始化物件, 即為物件成員變數賦初始值,總與new運算子一起使用在建立物件的語句中。特別的一個類可以有多個建構函式 ,可根據其引數個數的不同或引數型別的不同來區分它們 即建構函式的過載

    書寫方式:(public+類名(引數列表){})。

    每一個建構函式預設存在一個無參建構函式。

    構造方法中呼叫其他重構的構造方法必須在第一行。

    **程式碼塊:沒有方法名,沒有引數,在類例項化 的時候載入使用。(儘量使用構造方法,代替程式碼塊);

繼承:

    繼承就是子類(派生類)繼承父類(超類,基類)的特徵和行為,使得子類物件(例項)具有父類的例項域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為。

繼承的關鍵字:

1.         在 Java 中通過 extends 關鍵字可以申明一個類是從另外一個類繼承而來的;

2.         This指代當前類例項。

3.         Super-指的是當前類的直接父類的例項。

4.         Super();指的是呼叫父類的無參構造。

類的繼承格式:

    class 父類 {

    }

    class 子類 extends 父類 {

    }

在繼承關係當中,非私有的方法和屬性會被子類繼承,但是私有的不可以被子類繼承。

繼承的特點:

1.         對於子類來說,子類擁有父類的所有非私有方法與屬性,即包括(public,protected,default),修飾的所有方法和屬性,排除不同包的情況下一些特殊情況。

2.         Java僅支援單根繼承,意味著子類只有一個直接父類。

3.         在繼承關係中,如果需要例項化子類,則需要例項化直接父類,也就是說需要例項化所有跟父類有繼承關係的類。

4.         java所有類都繼承了object類。(泛型)

5.         執行順序:父類建構函式-子類建構函式-產生子類-產生子類的方法。

繼承的優點:

1.         減少重複程式碼,降低程式碼冗餘。

2.         如果父類已經有一些已有的方法和屬性,那麼子類繼承父類時,可以直接呼叫。

3.         子類可以有自己獨立的特殊方法,方便功能的擴充套件。

4.         方便功能的擴充套件。

重寫:(override)

1.         為了實現子類方法時候,產生不同的效果。

2.         重寫存在於繼承關係當中。

3.         一定是子類重寫父類的方法。

4.         重寫的方法一定是和父類中被重寫的方法結構一致(包括方法名和引數型別,引數數量)。

5.         訪問許可權只能擴大,不能縮小,即如果父類的方法是受保護的(protected),那麼子類重寫的方法可以是受保護的(protected),也可以是共有的(public)。

繼承中注意事項:

成員變數的訪問遵循:就近原則。

this訪問本來的成員

super訪問父類的成員

一個類的靜態程式碼塊,構造程式碼塊,構造方法的執行流程

靜態程式碼塊==》構造程式碼塊==》構造方法

靜態內容是隨著類的載入而載入,靜態程式碼塊的內容會優先執行。

類的初始化過程:

成員變數初始化==》預設初始化==》顯示初始化==》構造方法初始化

子類父類初始化:(分層初始化)

先進行父類初始化,然後進行子類初始化。

Java 多型

多型的優點:

  • 1. 消除型別之間的耦合關係
  • 2. 可替換性
  • 3. 可擴充性
  • 4. 介面性
  • 5. 靈活性
  • 6. 簡化性

多型的弊端:

    不能使用子類特有功能。

解決方案:

    建立子類物件的呼叫方法即可。(但是太佔記憶體)

    把父類的引用強制轉換為子類的引用。(向下轉型)。

多型存在的三個必要條件

  • 繼承
  • 要有方法的重寫。(其實沒有也可以,但是如果沒有這個就沒有意義!)
  • 父類引用指向子類物件。

多型中成員的訪問特點:

    f f=new s();

    成員變數:

        編譯看左邊,執行看左邊。

    構造方法:

        建立子類物件的時候,訪問父類的構造方法,對父類的資料進行初始化。

    成員方法

        編譯看左邊,執行看右邊。

    靜態方法:

        編譯看左邊,執行看左邊。

        (靜態和類相關,算不上重寫,所以,訪問還是左邊的)

    由於成員方法存在方法重寫,所以它執行看右邊。

多型中轉型問題:

向上轉型:從子到父,父類的引用只想子類的物件。

向下轉型:從父到子,父類的引用轉為子類的物件。

比如:

Parent p =new Child();

當使用多型方式呼叫方法時,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤;如果有,再去呼叫子類的同名方法。

多型的好處:可以使程式有良好的擴充套件,並可以對所有類的物件進行通用處理。

抽象與介面

抽象:

1.         抽象類的定義:所有使用關鍵字abstract的類都是抽象類。

2.         關於抽象類:

a)     抽象類中不一定有抽象方法 ,但是有抽象方法的類一定是抽象類。

b)         抽象類存在意義,用於被繼承。

c)         抽象類有建構函式(用於子類訪問父類資料的初始化),但不可以被直接例項化,抽象可以通過子類動態繫結例項化。

d)         抽象類中的抽象方法只是宣告,不包含方法體,就是不給出方法的具體實現也就是方法的具體功能。

e)抽象子類:

如果不想重寫抽象方法,該子類是一個抽象類。

如果重寫所有的抽象方法,這個時候子類是一個具體的類。

3.         抽象類的優點:

a)         從抽象方法來看,抽象方法要求必須被子類重寫(規範子類行為)。

b)         從非抽象方法上看,提取子類共有行為。

介面:

1.         介面的定義:

a)         介面是一個特殊的抽象類,以interface修飾。

b)         當一個抽象類中全部都是抽象函式時,我們叫介面。

2.         介面的作用:

a)         規範實現類行為

3.         介面的定義規則:

a)         Public  interface 介面名();

b)         使用方式:在類名後使用implements關鍵字後加介面名,如:

                         i.              Public class A implements interB{};

4.         介面的使用

a)         介面的實現要麼是抽象類,要麼是普通類,普通類要求重寫裡面的所有的方法。

b)         介面可以多重繼承。

c)         介面可以多重實現。

5.         介面的成員特點:

成員變數:只能是常量,並且是靜態的。預設修飾符:public static final

構造方法:介面沒有構造方法。

成員變數:只能是抽象方法。預設修飾符 :public abstract。

類與介面之間的關係:

類與類:繼承關係,只能單繼承,可以多層繼承。

類與介面:實現關係,可以單實現,也可以多實現。

介面與介面:繼承關係,可以單繼承,也可以多繼承。

抽象類和介面的區別:

成員區別:

抽象類:

成員變數:變數和常量都可以。

構造方法:有

成員方法:可以抽象,也可以非抽象。

介面:

成員變數:只能是靜態常量。

成員方法:只可以抽象。

關係區別:同類與介面關係。

設計理念的區別:

抽象類:被繼承體現的是:“is a”的關係。定義的是該繼承體系的共性功能。

介面:被實現體現的是:“like a”的關係。定義的是該繼承體系的擴充套件功能。

內部類:

成員內部類修飾符:

    private 為了保證資料的安全性

    static 為了方便訪問資料

        注意:靜態內部類訪問的外部類資料必須使用靜態修飾。

    注意:內部類和外部類沒有繼承關係。

          通過外部類名限定this物件。

區域性內部類:

    可以直接訪問外部類成員

    在區域性位置,可以建立內部類物件,通過物件呼叫內部類方法,來使用區域性內部類的功能。

    面試題:區域性內部類訪問區域性變數必須使用final修飾,這是為什麼呢?

            區域性變數是隨著方法的呼叫而呼叫,隨著方法的呼叫完畢而消失。

            而堆記憶體的內容並不會立即消失。所以,我們加final修飾。

            加入final修飾後,這個變數就成了常量,既然是常量,

            你消失了,我在記憶體中儲存的是後面的值,所以,我還有資料在使用。

匿名內部類:就是內部類的簡化寫法。

    前提:

        存在一個類或者介面(這裡的類可以是具體類也可以是抽象類)

    格式:

        new 類名或者介面名(){

            重寫方法;

        }

    匿名內部類本質是什麼呢?

        是一個繼承了該類或者實現了該介面的子類匿名物件。(可以通過多型的方式呼叫內部類裡面的方法)

JAVA GUI:

GUI:使用者圖形介面:graphic User Interface

java有兩套gui解決方案:swing, awt

swing:完全基於純Java程式碼實現,可以在不同的作業系統中執行。

awt:基於作業系統的圖形介面,不具備有效移植性。