顯示具有 備忘錄 標籤的文章。 顯示所有文章
顯示具有 備忘錄 標籤的文章。 顯示所有文章

2015年12月3日 星期四

switch 比對支援的型別

switch 比對支援的型別: chart , byte, short, int,
JAVA 5後開始支援: Character, Byte, Short, Integer,
JAVA 7後開始支援: String
還有 enum (列舉其實會被轉換成為int來比較)

Java 會自動import 的package

1. 沒有名字的套件(package with no name)
2.  java.lang
3. 目前所在套件(current package)

抽象類別注意事項:

1.  抽象類別可以實現(implements)介面
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 內容相同

2015年11月18日 星期三

Java的覆寫與遮蔽

當子類別重新定義父類別的方法時稱之為覆寫
當子類別重新定義父類別的屬性時稱之為遮蔽

當子類別物件被轉型為父類別時
使用覆寫的方法時會呼叫子類別中定義的方法
使用遮蔽的屬性時會使用父類別中定義的屬性
但依舊可以在物件內部使用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的不定長度引數其實只是編譯器蜜糖,本質是陣列展開。