最近有點事情,沒有及時更新筆記,學習不可棄,總結一下最近的學習,其中重點是static的一些應用,多態是一種設計理念,了解較容易,想如火純清的確不是一件容易的事情。
對于static,主要有兩點是我所學習的。
1、首先簡單的介紹一下static的定義。static是靜態的意思,就是說這個類變量或者類方法不需要實例化就可以使用。使用static的變量是類變量,也成為靜態域(static field)。這些是static的基本語義,了解了這些,繼續向下看。
java核心技術(卷一)對于靜態有這樣一段描述:“如果將變量定義為static,每個類都只有一個這樣的變量?!?/p>
這句話怎么理解呢,語言上表述是這樣的,在一個main方法中,類變量(靜態類)是所有對象所共享的(共享的意思有點像指針,你操作其中一個去改變數值,其他的數值都會發生改變)。這就是上面說的一個類只有一個這樣的變量。
在具體的代碼中會更直接。我定義一個Test的類:
public class Test{ public static int age; public int a;}在Test類中有一個靜態的int型變量age和一個非靜態變量a。
現在,下面的測試類中初始化3個Test對象,分別為t1,t2,t3;將t1的age設定為10,a設定為5,那么t2的age,a以及t3的age和a分別是多少呢?
public class TetsT{ public static void main(String[] args){ Test t1=newTest(); Test t2=new Test(); Test t3=new Test(); t1.age=10; t1.a=5; system.out.結果是,t1.age=t2.age=t3.age=10;
而t1.a=10;t2.a=0;t3.a=0;
原因不用解釋了吧,正如上面所說的,在一個main中一個類的類變量是共享的。這也是類變量危險的地方,盡量不要把靜態的暴露出來,可能會對程序產生影響。
2、靜態變量在繼承中是什么結果呢?
由于有了上面的鋪墊,直接寫出一個例子,有father類和繼承father的son類。結構很簡單。
public class father { public static int a=1;}public class son extends father{}father有靜態的類變量a,son繼承了father,這樣son有father的靜態變量a。
現在的問題是這個靜態變量有兩種可能,一是father與son共享,或者是son自己私有的。寫下面的代碼驗證:
public class test { public static void main(String[] args) { father f1 = new father(); father f2 = new father(); father f3 = new father(); father f4 = new son(); son s1 = new son(); f1.a=100; System.out.println(f1.a); System.out.println(f2.a); System.out.println(f3.a); System.out.println(s1.a); son s2=new son(); s2.a=50; System.out.println(s2.a); System.out.println(s1.a); System.out.println(f1.a); System.out.println(f2.a); }}打印的是什么呢?在上一行中打印的都是100,下一排打印的都是50。
得出結果,繼承類,其父類的靜態方法仍是與子類共享的關系。不論是父類還是子類對其值進行修改都會影響到其他對象的值。
3、說完static,簡單的說下我對多態的學習。
多態是指一個方法名,多個行為結果。這是多態的定義。
我感覺多態最核心的一句話是多態的實現。
多態是通過重寫(覆蓋)override和方法重載overload來實現的。這句話看起來很平淡,其實不是,它包含了多態最重要的東西。
舉個例子,假如現在需要使用類的思想,打印等腰三角形、直角三角形、正方形。這樣設計。
首先設計一個超類圖形類,他有一個變量n,用來存儲需要打印的圖形行數,還有一個方法,用來執行打印操作。
三個子類等腰三角形、直角三角形和正方形繼承超類圖形。此時選擇重寫打印操作,為每一個子類寫自己的打印操作。
在測試類中,我們聲明一個超類圖形類,可以給他new各個不同的子類,這樣就可以實現父類的一種打印操作分別打印不同的圖形了。
新聞熱點
疑難解答