標籤:
一.構造方法:一個類 被執行個體化 也就是被new的時候 最先執行的是 構造方法,在java類中,如果不顯示聲明建構函式,JVM 會給該類一個預設的建構函式。一個類 可以有多個建構函式。建構函式的主要作用 一是用來執行個體化該類。二是 讓該類執行個體化的時候執行哪些方法,初始化哪些屬性。當一個類聲明了建構函式以後,JVM 是不會再給該類分配預設的建構函式。其實建構函式是用來對一個類以及變數進行執行個體化。二.包的引用,包的引用有兩種方式一種是常見的import,第二種是在類的前面加上packagename.classname其實在Java編譯類的時候如果該類在某個Java包中會自動編譯成帶包的類名。有名的包不能訪問無名包的類(因為無名包如果不帶包名,本地的類找別的類預設為自己包中的類),無名包中的類能訪問有名包中的類(前提無名包中的類和包在一個目錄下面)三。final
final修飾的類不允許被繼承。
一個類不能既是final的,又是abstract的。因為abstract的主要目的是定義一種約定,讓子類去實現這種約定,而final表示該類不能被繼承,兩者矛盾。
final修飾方法
final
修飾方法,表示該方法不能被子類中的方法覆寫Override
。
final方法
將方法聲明為final,那就說明你已經知道這個方法提供的功能已經滿足你要求,不需要進行擴充,並且也不允許任何從此類繼承的類來覆寫這個方法,但是繼承仍然可以繼承這個方法,也就是說可以直接使用。另外有一種被稱為inline的機制,它會使你在調用final方法時,直接將方法主體插入到調用處,而不是進行例行的方法調用,例如儲存斷點,壓棧等,這樣可能會使你的程式效率有所提高,然而當你的方法主體非常龐大時,或你在多處調用此方法,那麼你的調用主體代碼便會迅速膨脹,可能反而會影響效率,所以你要慎用final進行方法定義。
final類
當你將final用於類身上時,你就需要仔細考慮,因為一個final類是無法被任何人繼承的,那也就意味著此類在一個繼承樹中是一個葉子類,並且此類的設計已被認為很完美而不需要進行修改或擴充。對於final類中的成員,你可以定義其為final,也可以不是final。而對於方法,由於所屬類為final的關係,自然也就成了final型的。你也可以明確的給final類中的方法加上一個final,但這顯然沒有意義。
final修飾變數
final成員變數表示常量,只能被賦值一次,賦值後值不再改變。
當final修飾一個原生資料類型時,表示該原生資料類型的值不能發生變化;
如果final修飾一個參考型別時,表示該參考型別不能再指向其他對象了,但該引用所指向的對象的內容是可以發生變化的。
本質上是一回事,因為引用的值是一個地址,final要求值,即地址的值不發生變化。
final修飾一個成員變數(屬性),必須要顯示初始化。
這裡有兩種初始化方式,一種是在變數聲明的時候初始化;第二種方法是在聲明變數的時候不賦初值,但是要在這個變數所在的類的所有的建構函式中對這個變數賦初值。
當函數的參數型別宣告為final時,說明該參數是唯讀型的。
super的用法
昨天寫this用法總結的時候,突然產生了一個問題,請教別人之後,有了自己的一點認識。還是把它寫下來,為大家更好的認識提供一點思路。
1)有人寫了個很好的初始化屬性的建構函式,而你僅僅想要在其中添加另一些自己建立屬性的初始化,這樣在一個建構函式中調用另外一個建構函式,可以避免重複的代碼量,減少工作量;
2)在一個建構函式中調用另外一個建構函式的時候應該用的是同一塊記憶體空間,在預設的建構函式中先初始設定變數,調用另一個的時候覆寫已經初始化的變數的值;
3)整個調用的過程和遞迴調用函數有點類似,不斷充氣球,直到整個氣球膨脹起來,不斷的深層遞進,遇到停止標記,逐層的跳出來。
寫了段代碼,解釋我上面的敘述:
1 class JavanTiger { 2 int age; // 年齡 3 int hight; // 身體高度 4 5 public JavanTiger() { 6 print(); 7 this.age=2; //這裡初始化 age 的值 ,但遞迴返回的時候,這個值會被覆寫 8 } 9 10 public JavanTiger(int age) {11 this(); // 調用自己的第一個建構函式,下面的兩個語句數不執行的12 this.age = age;13 print();14 }15 16 public JavanTiger(int age, int hight) {17 this(age); // 調用自己第二個建構函式 ,下面的兩個語句數不執行的18 this.hight = hight;19 print();20 }21 22 public void print() { //列印函數23 System.out.println("I‘am a " + age + "歲 " + hight + "尺高 tiger!");24 }25 public static void main(String[] args) {26 new JavanTiger(3,3);27 }28 }29 //output30 //I‘am a 0歲 0尺高 tiger!31 //I‘am a 3歲 0尺高 tiger!32 //I‘am a 3歲 3尺高 tiger!
個人理解就是這樣了,可能裡面還有問題,比如建構函式遞迴調用和程式函數遞迴調用的機制是否似乎相同的?建構函式同對象一起產生,也就是同時會分配記憶體空間出來,那門這樣的遞迴調用會不會打亂分配記憶體的順序?希望看到的大牛們拍板,給個最好的解釋。
今天要總結的是 super 這個關鍵字的使用,super 在建構函式中出現的時候一般是當前這個類繼承了其他的類,super 的出現就是為了調用父類的建構函式,貼段代碼先
1 class Tiger { 2 int age; // 年齡 3 int hight; // 身體高度 4 5 public Tiger() { 6 print(); 7 } 8 9 public void print() {10 System.out.println("I‘am a " + age + "歲 " + hight + "尺高 tiger!");11 }12 }13 public class JavanTiger extends Tiger { 14 public JavanTiger() {15 super(); // 調用父類無參數的建構函式16 }17 public static void main(String[] args) {18 new JavanTiger();19 }20 }
其實在類JavanTiger 中的建構函式中的 super()可以不寫,JAVA會預設調用父類的無參數的建構函式,但如果父類沒有定義無參數的建構函式,沒有語法錯誤,程式會自動結束,沒有任何列印語句,這時候你需要手動調用其他父類的建構函式,貼段代碼:
1 class Tiger { 2 int age; // 年齡 3 int hight; // 身體高度 4 5 public Tiger(int age) { 6 this.age = age; 7 print(); 8 } 9 public void print() {10 System.out.println("I‘am a " + age + "歲 " + hight + "尺高 tiger!");11 }12 }13 public class JavanTiger extends Tiger { 14 public JavanTiger() {15 super(1); // 調用父類有參數的建構函式16 }17 public static void main(String[] args) {18 new JavanTiger();19 }20 }
這段代碼中的 super(1)必須要寫進去,否則編譯器會報錯。所以我簡單的總結了一下,“this()是調用自己其他的建構函式,super()是調用自己繼承的父 類的建構函式“,如果只想調用預設無參數的父類建構函式,不用在子類的建構函式當中寫出來,但是實際編程的時候,總是會忽略這一點。
那門這兩個關鍵字能不能同時出現在子類的一個建構函式當中納?答案肯定是不能。先說下自己的理解:
1)在建立一個基類的時候,不論遞迴調用幾次自身的建構函式,最終你都會去調用父類的建構函式,(不是顯式調用的話,系統會調用預設無參數的父類建構函式);
2)JAVA 中規定使用 this 和 super 時必須放在建構函式第一行,只有一個第一行;只能使用一個要不然死迴圈
轉載:http://www.cnblogs.com/java-class/archive/2012/12/20/2826499.html
This的用法
用類名定義一個變數的時候,定義的應該只是一個引用,外面可以通過這個引用來訪問這個類裡面的屬性和方法,那們類裡面是夠也應該有一個引用來訪問自己的屬 性和方法納?呵呵,JAVA提供了一個很好的東西,就是 this 對象,它可以在類裡面來引用這個類的屬性和方法。先來個簡單的例子:
public class ThisDemo { String name="Mick"; public void print(String name){ System.out.println("類中的屬性 name="+this.name); System.out.println("局部傳參的屬性="+name); } public static void main(String[] args) { ThisDemo tt=new ThisDemo(); tt.print("Orson"); }}
關於返回類自身的引用,Thing in Java有個很經典的例子,通過this 這個關鍵字返回自身這個對象然後在一條語句裡面實現多次的操作,還是貼出來。
public class ThisDemo { int number; ThisDemo increment(){ number++; return this; } private void print(){ System.out.println("number="+number); } public static void main(String[] args) { ThisDemo tt=new ThisDemo(); tt.increment().increment().increment().print(); }}
那也應該在一個類中定義兩個建構函式,在一個建構函式中通過 this 這個引用來調用另一個建構函式,這樣應該可以實現,這樣的實現機制在實際做應用開發的時候有會有什麼樣子的用處納?貼下寫的代碼:
public class ThisDemo { String name; int age; public ThisDemo (){ this.age=21; } public ThisDemo(String name,int age){ this(); this.name="Mick"; } private void print(){ System.out.println("最終名字="+this.name); System.out.println("最終的年齡="+this.age); } public static void main(String[] args) { ThisDemo tt=new ThisDemo("",0); //隨便傳進去的參數 tt.print(); }}
看上面這段代碼雖然很短,理解起來似乎也很順理成章,在有參數的建構函式中賦值name 在無參數的當中賦值age屬性。但我個人覺得其中有點問題,執行個體化一個類應該先為對象ThisDemo分配記憶體,先調用建構函式 ThisDemo(String name,int age),執行到第一行的時候,調用ThisDemo()建構函式,也就是說這裡應該會有兩個記憶體空間的,一個是ThisDemo(String name,int age)執行到一點的空間和另一個是ThisDemo()執行空間,為什麼最後列印出來的結果是都執行個體化了一個對象中的兩個屬性name和age納?請大 牛賜教!
總結一下:
1) this 關鍵字是類內部當中對自己的一個引用,可以方便類中方法訪問自己的屬性;
2)可以返回對象的自己這個類的引用,同時還可以在一個建構函式當中調用另一個建構函式(這裡面上面有個問題)
轉載:http://www.cnblogs.com/java-class/archive/2012/12/19/2825463.html
Java中構造方法,包的引用,final,super等詞的概括