Java語言規範第九/十章-介面/陣列
Java語言規範第九章-介面(Java Language Specification – Chapter9 Interface)
並不是所有的modifiers都是用於所有型別的介面,例如protected和private只適用於類直接包含的成員介面。static只適用於成員介面。
public class Test {
class book {
interface dictionary{}//error
}
}
public class Test {
interface dictionary{}//ok
}
The member interface dictionary can only be defined inside a top-level class or interface.
所有介面隱式的都是abstract的。
所有的介面成員都隱式的是public的。
介面只能繼承介面。
介面只能繼承,不可以implements。
介面中的成員變數都是隱式的public static final的。
interface中的每個成員變數都必須包含初始化表示式。每個變數初始化只被呼叫一次,當介面被初始化的時候。
interface Test {
//error:Cannot reference a field before it is defined
float f = j;
int j = 1;
//error:Cannot reference a field before it is defined
int k = k+1;
}
在執行時,在編譯時初始化的常量先被初始化。這同樣適用於類中定義的static final常量。這意味著這些fields永遠不會檢視到其預設的初始值。
除非在匿名類的body中,否則在interface的field的初始化表示式中使用this或者super關鍵字將導致編譯時錯誤。
interface BaseColors {
int RED = 1, GREEN = 2, BLUE = 4;
}
interface RainbowColors extends BaseColors {
int YELLOW = 3, ORANGE = 5, INDIGO = 6, VIOLET = 7;
}
interface PrintColors extends BaseColors {
int YELLOW = 8, CYAN = 16, MAGENTA = 32;
}
interface LotsOfColors extends RainbowColors, PrintColors {
int FUCHSIA = 17, VERMILION = 43, CHARTREUSE = YELLOW+90,HAHAHA = RED + 90;;
}//error:The field YELLOW is ambiguous.
當一個field被多次繼承時,只會產生一個成員。例如正在上述的例子中,RED通過RainbowColors和PrintColors被LotsOfColors繼承,但是卻不會產生變異錯誤。因為實際上只有一個RED field的宣告。
interface中的方法隱式的定義為public abstract方法,允許但是不推薦使用顯式的宣告。宣告static方法是編譯時錯誤的,因為static方法無法是abstract的。
但是在abstract類中是可以宣告static方法的。
Java語言規範第十章-陣列(Java Language Specification – Chapter10 Array)
陣列是物件,是動態建立的,並且可以賦值給Object型別的變數。
int[] book = new int[]{};
println(book.getClass().getName());//[I
println(book.getClass().getSimpleName());//int[]
println(book.getClass().getCanonicalName());//int[]
String[] name = new String[]{};
println(name.getClass().getName());//[Ljava.lang.String;
println(name.getClass().getSimpleName());//String[]
println(name.getClass().getCanonicalName());//java.lang.String[]
int[][] books = new int[4][5];
println(books.getClass().getName());//[[I
println(books.getClass().getSimpleName());//int[][]
println(books.getClass().getCanonicalName());//int[][]
String[][] names = new String[][]{};
println(names.getClass().getName());//[[Ljava.lang.String;
println(names.getClass().getSimpleName());//String[][]
println(names.getClass().getCanonicalName());//java.lang.String[][]
Array的元素可以是任何型別,primitive或者reference。並且可以是介面或者抽象類。
宣告一個數組型別的變數並不建立一個array物件或者分配任何空間。只是建立變數本身。
}
由於陣列的長度不是該型別的一部分,所以一個數組型別的變數可以包含到不同長度陣列的引用。
陣列的length是public final的。一旦初始化了,就不可以被修改。
所有的陣列都實現了Cloneable和Serializable。