switch 比對支援的型別: chart , byte, short, int,
JAVA 5後開始支援: Character, Byte, Short, Integer,
JAVA 7後開始支援: String
還有 enum (列舉其實會被轉換成為int來比較)
2015年12月3日 星期四
抽象類別注意事項:
1. 抽象類別可以實現(implements)介面
2. 抽象類別不能使用 new 建立物件實體(匿名類別不在此列)
3. 抽象類別可以繼承具體類別
4. 抽象類別可以繼承抽象類別
5. 抽象類別內可以沒有抽象方法
6. 子類別在使用父類別抽象方法時一定要覆寫(override)才能使用並實作
7. 抽象方法不可以有{}
8. 抽象方法一定要有abstract關鍵字
9. 抽象方法存取權限不能是private
10.沒有抽象屬性
11.沒有抽象建構子
12.抽象方法不能是static
有個陷阱是
在抽象類別中定義非抽象方法,卻又沒有{},這是不合法的。
2. 抽象類別不能使用 new 建立物件實體(匿名類別不在此列)
3. 抽象類別可以繼承具體類別
4. 抽象類別可以繼承抽象類別
5. 抽象類別內可以沒有抽象方法
6. 子類別在使用父類別抽象方法時一定要覆寫(override)才能使用並實作
7. 抽象方法不可以有{}
8. 抽象方法一定要有abstract關鍵字
9. 抽象方法存取權限不能是private
10.沒有抽象屬性
11.沒有抽象建構子
12.抽象方法不能是static
有個陷阱是
在抽象類別中定義非抽象方法,卻又沒有{},這是不合法的。
2015年11月29日 星期日
字串比較 == 與 equals
在JAVA的字串比較中:
== 用來比對是否兩個字串指向同一個物件
equals 用來比對字串內容是否相同
String s1 = "JAVA";
String s2 = "JAVA";
String s3 = new String("JAVA");
String s4 = new String("JAVA");
其中:
s1 == s2 //true 由於物件池的存在 s1與s2的宣告方式 其實會指向同一個字串物件
s1.equals(s2) //true 內容相同
s3 == s1 //false 不同物件
s3.equals(s1) //true 內容相同
s3 == s4 //false 不同物件
s3.equals(s4) //true 內容相同
何謂字串池?
在Java1.4之後,為了提升字串的使用與效能,特別為字串在記憶體中(的Heap區 )建立了一個虛擬的物件池來存放字串。凡是直接指定字串的宣告,如s1與s2,其字串物件都會被放進字串池中。
字串池有個特點就是,相同的字串內容不會被重複建立字串物件,所以上面的s1與s2會是相同的物件,而s3與s4由於並沒有被存放在物件池中,所以實際上是兩個不同的物件。
注意:
由StringBuilder建立的物件是StringBuilder物件不是字串物件,所以不應該直接用equals與字串做比較,一般是使用toString()方法後再與字串比較。
StringBuilder s1 = new StringBuilder("Test");
String s2 = "Test";
s1 .toString().equals(s2); //true 內容相同
== 用來比對是否兩個字串指向同一個物件
equals 用來比對字串內容是否相同
String s1 = "JAVA";
String s2 = "JAVA";
String s3 = new String("JAVA");
String s4 = new String("JAVA");
其中:
s1 == s2 //true 由於物件池的存在 s1與s2的宣告方式 其實會指向同一個字串物件
s1.equals(s2) //true 內容相同
s3 == s1 //false 不同物件
s3.equals(s1) //true 內容相同
s3 == s4 //false 不同物件
s3.equals(s4) //true 內容相同
何謂字串池?
在Java1.4之後,為了提升字串的使用與效能,特別為字串在記憶體中(的Heap區 )建立了一個虛擬的物件池來存放字串。凡是直接指定字串的宣告,如s1與s2,其字串物件都會被放進字串池中。
字串池有個特點就是,相同的字串內容不會被重複建立字串物件,所以上面的s1與s2會是相同的物件,而s3與s4由於並沒有被存放在物件池中,所以實際上是兩個不同的物件。
注意:
由StringBuilder建立的物件是StringBuilder物件不是字串物件,所以不應該直接用equals與字串做比較,一般是使用toString()方法後再與字串比較。
StringBuilder s1 = new StringBuilder("Test");
String s2 = "Test";
其中:
s1 .toString().equals(s2); //true 內容相同
2015年11月18日 星期三
Java的覆寫與遮蔽
當子類別重新定義父類別的方法時稱之為覆寫
當子類別重新定義父類別的屬性時稱之為遮蔽
當子類別物件被轉型為父類別時
使用覆寫的方法時會呼叫子類別中定義的方法
使用遮蔽的屬性時會使用父類別中定義的屬性
但依舊可以在物件內部使用super來使用父類別定義的方法與屬性
在程式第10行中將物件轉型為MyFruit型態,其name屬性輸出為Fruit。
在程式第11行中將物件轉型為MyFruit型態,但其getName()方法輸出為Banana。
當子類別重新定義父類別的屬性時稱之為遮蔽
當子類別物件被轉型為父類別時
使用覆寫的方法時會呼叫子類別中定義的方法
使用遮蔽的屬性時會使用父類別中定義的屬性
但依舊可以在物件內部使用super來使用父類別定義的方法與屬性
package learning.test;
public class overloadtest {
public static void main(String[] args) {
Banana mybanana = new Banana();
System.out.println(mybanana.name);
System.out.println(mybanana.getName());
System.out.println(((Banana) mybanana).name);
System.out.println(((Banana) mybanana).getName());
System.out.println(((MyFruit) mybanana).name);
System.out.println(((MyFruit) mybanana).getName());
}
}
class MyFruit {
String name = "Fruit";
String getName() {
return name;
}
}
class Banana extends MyFruit {
String name = "Banana";
String getName() {
return name;
}
}
輸出:在程式第10行中將物件轉型為MyFruit型態,其name屬性輸出為Fruit。
在程式第11行中將物件轉型為MyFruit型態,但其getName()方法輸出為Banana。
Banana Banana Banana Banana Fruit Banana
2015年11月16日 星期一
JAVA的不定長度引數
1. 格式:function ( type... variableName)
例: public int test(int... x)
2. 不定長度引數必然為參數列的最後一個參數
例: public int test(int x, int... y) -- 可
例: public int test(int... x, int y) -- 不可
3. 參數列中只能有一個不定長度引數
例: public int test(int x, int... y) -- 可
例: public int test(int... x, int... y) -- 不可
4. JAVA的不定長度引數其實只是編譯器蜜糖,本質是陣列展開。
例: public int test(int... x)
2. 不定長度引數必然為參數列的最後一個參數
例: public int test(int x, int... y) -- 可
例: public int test(int... x, int y) -- 不可
3. 參數列中只能有一個不定長度引數
例: public int test(int x, int... y) -- 可
例: public int test(int... x, int... y) -- 不可
4. JAVA的不定長度引數其實只是編譯器蜜糖,本質是陣列展開。
訂閱:
文章 (Atom)