java語言積累
1、什麼時候“被覆蓋”:
靜態方法不能被覆蓋,只能被隱藏,執行個體方法可以被覆蓋。
01: class Super
02: {
03: static String greeting()
04: {
05: return "Goodnight";
06: }
07:
08: String name()
09: {
10: return "Richard";
11: }
12: }
01: class Sub extends Super
02: {
03: static String greeting()
04: {
05: return "Hello";
06: }
07:
08: String name()
09: {
10: return "Dick";
11: }
12: }
01: class Test
02: {
03: public static void main(String[] args)
04: {
05: Super s = new Sub();
06: System.out.println(s.greeting() + ", " + s.name());
07: }
08: }
結果:Goodnight, Dick
l 試圖用子類的靜態方法隱藏父類中同樣標識的執行個體方法是不合法的 編譯器將會報 錯 l 試圖用子類的執行個體方法覆蓋父類中同樣標識的靜態方法也是不合法的 編譯器同樣 會報錯 l 靜態方法和最終方法 帶關鍵字final 的方法不能被覆蓋 l 執行個體方法能夠被覆蓋 l 抽象方法必須在具體類1中被覆蓋 |
2、String.equals()與===區別
equals比較的是字串內容;==比較的是對象的引用的值.
01: public class StringExample
02: {
03: public static void main (String args[])
04: {
05: String s0 = "Programming";
06: String s1 = new String ("Programming");
07: String s2 = "Program" + "ming";
08:
09: System.out.println("s0.equals(s1): " + (s0.equals(s1)));
10: System.out.println("s0.equals(s2): " + (s0.equals(s2)));
11: System.out.println("s0 == s1: " + (s0 == s1));
12: System.out.println("s0 == s2: " + (s0 == s2));
13: }
14: }
結果:
s0.equals(s1): true
s0.equals(s2): true
s0 == s1: false
s0 == s2: true
常量池:是指在編譯時間期被確定的值,並儲存在已編譯的class檔案中的一些資料。
3、java是強型別語言
它只支援8種基本類型資料類型。而8種資料類型始終被描述在JVM中。
4、那是建構函式
一般建議:只有構造方法才與類名同名.
在一個類中假如沒有顯式的建構函式存在 那麼Java 會自動為其配備一個預設的無參數的建構函式而且這個建構函式是空的這種情 況若且唯若類中沒有聲明任何一個建構函式時才會發生假如類中已經存在了一個帶任意參 數的建構函式那麼Java 就不會再自動提供預設的無參數的建構函式了 |
01: public class IntAdder
02: {
03: private int x;
04: private int y;
05: private int z;
06:
07: public void IntAdder()
08: {
09: x = 39;
10: y = 54;
11: z = x + y;
12: }
13:
14: public void printResults()
15: {
16: System.out.println("The value of 'z' is '" + z + "'");
17: }
18:
19: public static void main (String[] args)
20: {
21: IntAdder ia = new IntAdder();
22: ia.printResults();
23: }
24: }
結果為0;
5、不能訪問被覆蓋的方法
可以通過包含關鍵字super 的方法調用運算式來訪問被覆蓋的方法注意嘗試用全域 名或強制轉換為父類型以求訪問一個被覆蓋的方法都是無效的 無法訪問父類中被子類覆蓋的方法的原則僅僅適用於執行個體方法也就 是非靜態方法 假如你懷疑你所使用的某個對象實際上是一個子類的執行個體那麼你可以調用它的getClass().getName()方法來判斷它的真實身份. 又如果你是編寫增加了新功能的子類的程式員那你必須確保進行相容性測試或者保證在編寫程式時任何新增的功能都是通過增加新的方法而不是覆蓋父類方法實現的 |
6、避免落入隱藏變數的陷阱
(1)不同類型的Java變數:
Java一共有6種變數類型:類變數、執行個體變數、方法參數、建構函式參數、異常處理器參數以及局部變數。
類變數包括:類中聲明的待用資料成員、介面體中聲明的靜態成員和非待用資料成員。
執行個體變數:在類體中聲明的非靜態變數。
方法參數:用來傳入一個方法體的。
建構函式參數:用來傳入一個建構函式體的。
異常處理參數:用來傳入一個try語句的catch塊中的。
局部變數:在一個代碼塊中或一個for語句中聲明的變數。
01: public class Types
02: {
03: int x; // instance variable
04: static int y; // class variable
05: public Types(String s) // s is a constructor parameter
06: {
07: // constructor code f.
08: }
09: public createURL(String urlString) //urlString is a method parameter
10: {
11: String name = "example"; // name is a local variable
12: try
13: {
14: URL url = new URL(urlString);
15: }
16: catch(Exception e) // e is a exception-handler parameter
17: {
18: // handle exception
19: }
20: }
21: }
(2)何種變數能夠被隱藏:
執行個體變數和類變數能夠被隱藏。
(3)如何訪問被隱藏的變數
this:可以限定一個正被局部變數隱藏的執行個體變數
super:可以限定一個正被子類隱藏的執行個體變數。
(4)變數隱藏與方法覆蓋的區別
一個類的執行個體,無法通過使用全域名,或者強制轉換自己為其父類的類型,來訪問父類中的被覆蓋的方法。
強制轉換子類的執行個體為父類類型後,我們就可以訪問父類中被隱藏的變數。
資料隱藏與方法覆蓋的另一個不同之處:靜態方法不能覆蓋父類的執行個體方法。而靜態變數卻可以隱藏父類同名的一個執行個體變數。
執行個體方法也不能覆蓋父類的靜態方法,而執行個體變數卻可隱藏父類同名的變數成員。
7、提前引用
類變數以及靜態初始化塊是在類被JVM載入時初始化操作的。
靜態初始化塊和類變數時按照其在代碼中出現的順序依次執行初始化操作的。
若用方法調用初始化靜態變數,那麼必須保證方法不依賴於他們之後聲明的其它靜態變數。
8、設計易被繼承的構造方法
設計合適的構造方法滿足需求。
9、通過引用傳遞基本類型
基本類型不是對象,不能通過引用來傳遞。
10、布林運算子與“短路”運算子
布林運算子:& 和 | (兩邊都是boolean型值,那麼&才被認為是布爾運算)
位元運算符 :&& 和 ||