static、default
在介面裡java7(含)之前:
屬性:只能是static,且一定要有初始值(沒寫static,預設為public static final)
一般方法:不能實作,不寫修飾子,預設為 public abstract
static 方法:static會編譯錯誤
java8:
屬性:和之前一樣
一般方法:和之前一樣
static 方法:可以用了,但一定要實作,所以main方法可以寫在介面裡了
修飾子一定都是public,不打可以,但打就一定要打public,否則會編譯錯誤
java8還出現了一個default關鍵字,只能用在方法,且一定要實作
寫了 default,就不會有隱藏的 abstract 了,而且 default 、abstract、static 只能取其一
defaullt 也可以用泛型方法,定義在 default 關鍵字的右邊
但要注意繼承時,static不會被繼承下去,default可以,如下:
※
interface I1 {
default void defaultMethod() {
System.out.println("i1 default method");
}
static String sfield = "i1 sfield";
String field = "i1 field";
static void staticMethod() {
System.out.println("i1 method");
}
}
interface I2 {
default void defaultMethod() {
System.out.println("i2 default method");
}
static String sfield = "i2 sfield";
String field = "i2 field";
static void staticMethod() {
System.out.println("i2 method");
}
}
public class Java8Test implements I2, I1 {
public static void main(String[] args) {
Java8Test test = new Java8Test();
test.defaultMethod();
}
/*
@Override
public void defaultMethod() {
I2.super.defaultMethod();
}
*/
}
※I1 和 I2 如果有繼承關係,那麼 Java8Test 就不需要實作,印出來的是子介面
※I1 和 I2 如沒有繼承關係,就要實作其中一個,這樣test.defaultMethod()才知道要呼叫哪一個,如註解的部分
※
interface I3 extends I1, I2{
default void defaultMethod(){
I2.super.defaultMethod();
}
}
public class Java8Test implements I3 {
// ...
}
※也可以再寫一支介面,繼承I1和I2,將介面.super.default方法寫在裡面,然後測試類直接繼承新的介面即可,此時I1和I2有無繼承就沒有關係了
※this
上面的程式碼有super,當然也會有thisinterface I1 {
default String i1a() {
return this.i1b() + this.i1c();
}
default String i1b() {
return "call ";
}
default String i1c() {
return "success";
}
}
public class Java8Test {
public static void main(String[] args) {
I1 i = new I1() {};
System.out.println(i.i1a());
}
}
※java7(含)之前,不能new介面,除非用匿名類別
但java8 default的方法已經實作了,所以可以new介面了,但要有「{}」
※覆蓋
interface I1 {
default String method() {
return "xxx";
}
}
interface I2 extends I1 {
default String method() {
return null;
}
}
interface I3 extends I2 {
String method();
}
public class Java8Test implements I3 {
public static void main(String[] args) {
System.out.println(new I1() {}.method());// xxx
System.out.println(new I2() {}.method());// null
// System.out.println(new I3() {}.method());// 編譯錯誤
System.out.println(new Java8Test().method());// ooo
}
@Override
public String method() {
return "ooo";
}
}
※如果I2沒有覆寫I1的方法,就都會是xxx
※I3還可以將已實作的方法,改成抽象,所以I3又不能new了,解決方法和之前的版本一樣

沒有留言:
張貼留言