java介面巢狀【Z】
在Java語言中,介面可以巢狀在類或其它介面中。由於Java中interface內是不可以巢狀class的,所以介面的巢狀就共有兩種方式:class巢狀interface、interface巢狀interface。
1. class巢狀interface
這時介面可以是public,private和package的。重點在private上,被定義為私有的介面只能在介面所在的類被實現。可以被實現為
public的類也可以被實現為private的類。當被實現為public時,只能在被自身所在的類內部使用。只能夠實現介面中的方法,在外部不能像正
常類那樣上傳為介面型別。
2. interface巢狀interface
由於介面的元素必須是public的,所以被巢狀的介面自動就是public的,而不能定義成private的。在實現這種巢狀時,不必實現被巢狀的介面。
程式示例(摘抄改編自《Thinking in Java》):
class
A
{
private interface D {
void f();
}
private class DImp implements D {
public void f() {}
}
public class DImp2 implements D {
public void f() {}
}
public D getD() { return new DImp2(); }
private D dRef;
public void receiveD(D d) {
dRef = d;
dRef.f();
}
}
public class NestingInterfaces {
public static void main(String[] args) {
A a = new A();
// The type A.D is not visible
// ! A.D ad = a.getD();
// Cannot convert from A.D to A.DImp2
// ! A.DImp2 di2 = a.getD();
// The type A.D is not visible
// ! a.getD().f();
A a2 = new A();
a2.receiveD(a.getD());
}
}
private interface D {
void f();
}
private class DImp implements D {
public void f() {}
}
public class DImp2 implements D {
public void f() {}
}
public D getD() { return new DImp2(); }
private D dRef;
public void receiveD(D d) {
dRef = d;
dRef.f();
}
}
public class NestingInterfaces {
public static void main(String[] args) {
A a = new A();
// The type A.D is not visible
// ! A.D ad = a.getD();
// Cannot convert from A.D to A.DImp2
// ! A.DImp2 di2 = a.getD();
// The type A.D is not visible
// ! a.getD().f();
A a2 = new A();
a2.receiveD(a.getD());
}
}
其中語句A.D ad = a.getD()和a.getD().f()的編譯錯誤是因為D是A的私有介面,不能在外部被訪問。語句A.DImp2 di2 = a.getD()的錯誤是因為getD方法的返回型別為D,不能自動向下轉型為DImp2型別。
相關文章
- 類與介面(三)java中的介面與巢狀介面Java巢狀
- java複雜奇葩的巢狀類和介面Java巢狀
- Java進階07 巢狀類Java巢狀
- java定時任務巢狀Java巢狀
- Java巢狀類(NestedClasses)總結Java巢狀
- Java | 靜態巢狀類(Static Nested Class)Java巢狀
- less巢狀巢狀
- Datalist巢狀巢狀
- 集合框架-集合的巢狀遍歷(HashMap巢狀HashMap)框架巢狀HashMap
- 集合框架-集合的巢狀遍歷(HashMap巢狀ArrayList)框架巢狀HashMap
- 集合框架-集合的巢狀遍歷(ArrayList巢狀HashMap)框架巢狀HashMap
- 集合框架-集合的巢狀遍歷(多層巢狀)框架巢狀
- vue路由巢狀Vue路由巢狀
- angular 巢狀路由Angular巢狀路由
- 迴圈_巢狀巢狀
- 集合的巢狀巢狀
- 盒子的巢狀巢狀
- oracle巢狀表Oracle巢狀
- Oracle 巢狀表Oracle巢狀
- 列表巢狀操作巢狀
- 【java】【集合】去除ArrayList中的元素、ArrayList巢狀ArrayListJava巢狀
- Effective Java讀書筆記八:巢狀類(22)Java筆記巢狀
- Locust 任務巢狀巢狀
- Oracle 巢狀表(轉)Oracle巢狀
- 巢狀子查詢巢狀
- vue(19)巢狀路由Vue巢狀路由
- SCSS 巢狀屬性CSS巢狀
- SCSS 巢狀規則CSS巢狀
- Blazor巢狀傳遞Blazor巢狀
- 巢狀動畫如何使用巢狀動畫
- iterate的巢狀使用巢狀
- 巢狀使用 datalist (轉)巢狀
- 展開巢狀列表巢狀
- Java JDK11基於巢狀的訪問控制JavaJDK巢狀
- java中如何將巢狀迴圈效能提高500倍Java巢狀
- PLSQL Language Referenc-巢狀表-巢狀表和陣列間的重要區別(正確地使用巢狀表)SQL巢狀陣列
- nginx 如何實現 if 巢狀Nginx巢狀
- html的巢狀規則HTML巢狀