1. 程式人生 > >Java之巢狀介面詳解(附原始碼)

Java之巢狀介面詳解(附原始碼)

package com.mufeng.theninthchapter;

class A {
	interface B {
		void f();
	}

	public class BImp implements B {

		@Override
		public void f() {
			// TODO Auto-generated method stub

		}
	}

	private class BImp2 implements B {

		@Override
		public void f() {
			// TODO Auto-generated method stub

		}
	}

	public interface C {
		void f();
	}

	class CImp implements C {

		@Override
		public void f() {
			// TODO Auto-generated method stub

		}
	}

	private class CImp2 implements C {

		@Override
		public void f() {
			// TODO Auto-generated method stub

		}

	}

	private interface D {
		void f();
	}

	private class DImp implements D {

		@Override
		public void f() {
			// TODO Auto-generated method stub

		}
	}

	public class DImp2 implements D {

		@Override
		public void f() {
			// TODO Auto-generated method stub

		}
	}

	public D getD() {
		return new DImp2();
	}

	private D dRef;

	public void receiveD(D d) {
		dRef = d;
		dRef.f();
	}
}

interface E {
	interface G {
		void f();
	}

	public interface H {
		void f();
	}

	void g();

	// Cannot be private within an interface:
	// private interface I{
	// void f();
	// }
}

public class NestingInterfaces {

	public class BImp implements A.B {

		@Override
		public void f() {
			// TODO Auto-generated method stub

		}
	}

	class CImp implements A.C {

		@Override
		public void f() {
			// TODO Auto-generated method stub

		}
	}

	// Cannot implement a private interface except
	// within that interface's defining class
	// class DImp implements A.D {
	// @Override
	// public void f() {
	// // TODO Auto-generated method stub
	//
	// }
	// }

	class EImp implements E {

		@Override
		public void g() {
			// TODO Auto-generated method stub

		}
	}

	class EGImp implements E.G {

		@Override
		public void f() {
			// TODO Auto-generated method stub

		}

	}

	class EImp2 implements E {

		@Override
		public void g() {
			// TODO Auto-generated method stub

		}

		class EG implements E.G {

			@Override
			public void f() {
				// TODO Auto-generated method stub

			}

		}
	}

	public static void main(String[] args) {
		A a = new A();
		// Can't access A.D
		// !A.D ad=a.getD();

		// Doesn't return anything but A.D
		//!A.DImp2 di2 = a.getD();
		
		//Cannot access a member of the interface
		//!a.getD().f();
		
		//Only another A can do anything with getD():
		A a2=new A();
		a2.receiveD(a.getD());
	}

}

原始碼解析

       在類中巢狀介面的語法是相當顯而易見的,就像非巢狀介面一樣,可以擁有public和“包訪問”兩種可視性。        作為一種新新增的方式,介面也可以被實現為private的,就像在A.D中所看到的(相同的語法既適用於巢狀介面,也適用於巢狀類)。那麼private的巢狀介面能帶來什麼好處呢?讀者可能會猜想,它只能夠被實現為DImple中的一個private內部類,但是A.DImp2展示了它同樣可以被實現為public類。但是,A.DImp2只能被其自身所使用。你無法說它實現了一個private介面D。因此,實現一個private介面只是一種方式,它可以強制該介面中的方法定義不要新增任何型別資訊(也就是說,不允許向上轉型)。        getD()
方法使我們陷入了一個進退兩難的境地,這個問題與private介面相關:它是一個返回對private介面的引用的public方法。你對這個方法的返回值能做些什麼呢?在main()中,可以看到數次嘗試使用返回值的行為都失敗了。只有一種方式可成功,那就是將返回值交給有權使用它的物件。在本例中,是另一個A通過receiveD()方法來實現的。        介面E說明介面彼此之間也可以巢狀。然而,作用於介面的各種規則,特別是所有的介面元素必須是public的,在此都會被嚴格執行。因此,巢狀在另一個介面中的介面自動就是public的,而不能宣告為private。        NestingInterfaces
展示了巢狀介面的各種實現方式。特別要注意的是,當實現某個介面時,並不需要實現巢狀在其內部的任何介面。而且,private介面不能在定義它的類之外被實現。

相關推薦

Java介面原始碼

package com.mufeng.theninthchapter; class A { interface B { void f(); } public class BImp implements B { @Override public void f() { // TODO

Java區域性內部類和匿名內部類的區別原始碼

前言        前面提到過,可以在程式碼塊裡建立內部類,典型的方式是在一個方法體裡面建立。區域性內部類不能有訪問說明符,因為它不是外圍類的一部分;但是他可以訪問當前程式碼塊內的常量,以及此外圍類

Java 中break和continue結合標籤標示符中斷迴圈示例原始碼

臭名昭著的goto        程式語言中一開始就有goto關鍵詞了。事實上,goto起源於組合語言的程式控制:“若條件A成立,則跳到這裡;否則跳到那裡”。如果閱讀由編譯器最終生成的彙編程式碼,就會

NodeJS中的事件EventEmitter API原始碼

EventEmitter 簡介 EventEmitter 是 NodeJS 的核心模組 events 中的類,用於對 NodeJS 中的事件進行統一管理,用 events 特定的 API 對事件進行新增、觸發和移除等等,核心方法的模式類似於釋出訂閱。 實現 EventEm

Android跨程序通訊AIDL原始碼

概述 AIDL:Android Interface Definition Language,即Android介面定義語言,記住,它是一門語言,設計它的目的就是為了實現跨程序通訊,我們知道Android的每一個程序都執行在獨立的記憶體中,程序之間程式碼是不能愉快

“全棧2019”Java第八十四章:介面介面

難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 IntelliJ IDEA v2018.3 文章原文連結 “全棧2019”Java第八十四章:介面中巢狀介面詳解 下一章 “

Redis集群配置文件待完善

enable ice local ise bare config 停止 databases end 運維Redis集群的核心任務就是配置文件Redis.conf 命令行將現使用的Redis配置參數導出到 redis.conf.bak文件 grep ‘^[^#]‘ /etc

Java Scanner 類例子學習

在筆試程式設計過程中,關於資料的讀取如果迷迷糊糊,那後來的程式設計即使想法很對,實現很好,也是徒勞,於是在這裡認真總結了Java  Scanner 類的使用 通過 Scanner 類來獲取使用者的輸入,下面是建立 Scanner 物件的基本語法: Scanner s =

Java 開發必備面試題技術+人事

作為一名程式猿,無論新手還是老司機,面試求職始終是你需要直面的一件事情。首先梳理自己的知識體系,針對性準備,會有事半功倍的效果。我們往往會把重點放在技術上,而忽略了人事部分,實際上人事面試也會影響到最終的結果,把每一個環節做好,最終的結果自然不會差。 本 Chat 就為大家提供了一份詳盡的 Jav

AndroidActivity啟動流程基於api28

### 前言 Activity作為Android四大元件之一,他的啟動絕對沒有那麼簡單。這裡涉及到了系統服務程序,啟動過程細節很多,這裡我只展示主體流程。activity的啟動流程隨著版本的更替,程式碼細節一直在進行更改,每次都會有很大的修改,如android5.0 android8.0。我這裡的版本是基於

Objective-C屬性程式碼

宣告 在Objective-C中,有兩種宣告變數的方法,第一種直接宣告: @interface Person : NSObject { NSString *name; NSString *sex; NSString *age;

XMPPFramework初始化、登入、註冊程式碼

第一步、新增依賴 > 拷貝 <XMPPFramework>/Vendor/CocoaLumberjack 到專案根目錄下,add files...,選擇 CocoaLumberjack 資料夾 > 同樣的步驟,拷貝 CocoaAsync

兒童節特刊 | 如何練好手眼協調能力手眼標定原始碼

當嬰幼兒看到物體時,首先通過眼睛獲取資訊,傳輸到大腦進行理解,最終通過手來操作完成玩具的抓取、放置。手、眼、腦協同是人類和少數動物的一項特殊技能,通過經常玩一些簡單的益智玩具,可以逐漸鍛鍊增強孩子的手眼協調能力,同時可以作用到大腦,促進孩子的智力發育。 商家們也看到了這塊領域,設計出很多益智玩具和遊戲,如圖1

GO語言slice結合原始碼

一、GO語言中slice的定義 slice 是一種結構體型別,在原始碼中的定義為: src/runtime/slice.go type slice struct { array unsafe.Pointer len int cap int } 從定義中可以看到,slice

自然語言處理:c++中文分詞原始碼

githup地址:https://github.com/jbymy 一、簡介 中文分詞是地然語言處理中的最基礎的環節,到目前為止已經有不少優秀的分詞工具的出現,如“中科院分詞”,“結

“全棧2019”Java第六十七章:內部類、

難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 IntelliJ IDEA v2018.3 文章原文連結 “全棧2019”Java第六十七章:內部類、巢狀類詳解 下一章 “全棧2019”Java第六十八章:外部類訪問內部類

Java介面

一、基本概念 介面(Interface),在JAVA程式語言中是一個抽象型別,是抽象方法的集合。介面通常以interface來宣告。一個類通過繼承介面的方式,從而來繼承介面的抽象方法。 如果一個類只由抽象方法和全域性常量組成,那麼這種情況下不會將其定義為一個

Java定時任務排程工具5— Quartz Trigger

五、淺談Trigger Trigger是什麼 Quartz中的觸發器用來告訴排程程式作業什麼時候觸發 即Trigger物件是用來觸發執行Job的 Quartz框架中的Trigger示意圖 觸發器通用屬性 JobKey:表示job例項的標識,觸發

Java學習筆記31--介面

一、基本概念 介面(Interface),在JAVA程式語言中是一個抽象型別,是抽象方法的集合。介面通常以interface來宣告。一個類通過繼承介面的方式,從而來繼承介面的抽象方法。 如果一個類只由抽象方法和全域性常量組成,那麼這種情況下不會將其定義為一個抽象類。只會定義為一個介面,所以介面嚴格的來

Java中繼承、介面、多型的作用純理論

一、繼承、介面與多型的相關問題: 1、 繼承的作用?好處?壞處? 繼承:通過繼承實現程式碼複用。Java中所有的類都是通過直接或間接地繼程java.lang.Object類得到的。繼承而得到的類稱為子類,被繼承的類稱為父類。子類不能繼承父類中訪問許可權為private的成員變數和方法。子類可以重寫父類的方法