您的位置:首頁>遊戲>正文

Java基礎語法《九》 介面與內部類

1 介面 interface implement

介面的所有方法自動地屬於public。 因此, 在介面中聲明方法時, 不必提供關鍵字public。

介面可以包含多個方法, 介面中可以定義常量。 介面中的域將被自動設為public static final。

SwingConstants就是只定義了常量, 而沒有定義方法, 任何實現了SwingConstant介面的類都自動地繼承了這些常量, 並可以在方法中直接地引用一些常量。

1.1 介面的特性

介面不是類, 尤其不能使用new運算子產生實體一個介面

但是可以聲明介面變數, 必須引用實現了介面的類物件。

使用instanceof檢查一個物件是否屬於某個特定類一樣, 也可以使用instance檢查一個物件是否實現了某個特定的介面。

每個類只能夠擁有一個超類, 但卻可以實現多個介面

1.2 介面與抽象類別

抽象類別也是只定義方法, 但是不實現

總點在於繼承只能繼承一個, 實現介面可以實現多個。

2 物件克隆

當拷貝一個變數時, 原始變數與拷貝變數引用同一個物件。 也就是說, 改變一個變數所引用的物件將會對另一個變數產生影響。

拷貝與克隆:

clone方法

clone方法時Object類的一個protected方法, 也就是說, 在用戶編寫的代碼中不能直接調用它。

1默認的clone方法是否滿足要求2默認的clone方法是否能夠通過調用可變子物件的clone得到修補3是否不應該使用clone

3是預設的

如需要選擇1和2

a 實現Cloneable介面類別b 使用public訪問修飾符重新定義clone方法

3 介面和回檔

回檔callback是一種常見的程式設計模式。 在這種模式下, 可以指出某個特定發生應該採取的動作。

4 內部類

innerclass 是定義在另一個類中的類

需要內部類的原因:

a 內部類方法可以訪問該類定義所在作用域的所有資料, 包括私有資料b 內部類可以對同一個包中的其他類隱藏起來c 當想要定義一個回呼函數且不想編寫大量代碼時,
使用匿名內部類比較便捷

4.1 使用內部類訪問物件狀態

訪問週邊類的實例類

內部類既可以訪問自身的資料欄, 也可以訪問創建它的週邊類物件的資料欄

內部類的物件總有一個隱式引用(outer), 它指向創建它的外部類物件。

4.2 內部類的特殊語法規則

訪問週邊類引用的正規語法複雜, 運算式OuterClass.this表示週邊類引用。

在週邊類的作用域之外, 可以這樣引用內部類

OuterClass.InnerClass

4.3 內部類是否有用、必要和安全

編譯器會把內部類翻譯成用($)美元符號分隔外部類名域內部類名的常規類檔。

如果內部類訪問了私有資料欄, 就有可能通過附加在週邊類所在包中的其他類訪問它們, 但做這些事情需要高超的技巧和極大的決心。

4.4 局部內部類

局部類不能用public和private訪問說明符進行聲明。 它的作用域被限定在聲明這個局部類的塊中。

局部類有一個優勢, 即對外部世界可以完全隱藏起來。

4.5 由外部方法訪問final變數

與內部類相比, 不僅能夠訪問包含它們的外部類, 局部類還可以訪問區域變數。 那些區域變數必須是final

在內部類被首次提出時, 原型編譯器對內部類中修改的區域變數自動地進行轉換。

4.6 匿名內部類

假如只創建這個類的一個物件, 就不必命名了。 這種累叫做匿名內部類。

4.7 靜態內部類

使用內部類只是為了把一個類隱藏在另一個類的內部, 可以將內部類聲明為static, 以便取消產生的引用

5 代理 proxy java1.3

利用代理可以在運行時創建一個實現了一組給定介面的新類。

假設有一個表示介面的Class物件, 它的確切類型在編譯時無法知道。

要想構造一個實現這些介面的類, 就需要使用newInstance方法或反射找出這個類的構造器。 但是不能產生實體介面, 需要在程式處於運行狀態時定義一個新類。

代理機制是一種解決方案, 代理類可以在運行時創建全新的類。 這樣的代理類能夠實現指定的介面。

指定介面所需要的全部方法

Object類中的全部方法,

然而不能再運行時定義這些方法的新代碼, 而是要提供一個調用處理器(invocation handler)。 調用處理器是實現了invocationHandler介面的物件。 在這個介面中只有一個方法:

Object invoke(Object proxy,Method method,Object[] args)

無論何時調用代理物件的方法, 調用處理器的invoke方法都會被調用, 並向其傳遞Method物件和原始的調用參數。 調用處理器必須給出處理調用的方法。

要想創建一個代理物件,需要使用Proxy類的newProxyInstance方法。這方法有三個參數

一個Class物件陣列,每個元素都是需要實現的介面

一個調用處理器。

這有兩個需要解決的問題

如何定義一個處理器?

能夠用結果代理物件做些什麼?

路由對遠端伺服器的方法調用

在程式運行期間,將使用者介面事件與動作關聯起來。

為調試,跟蹤方法調用

5.1 代理類的特性

代理類是在程式運行過程中創建的。

所有的代理類都擴展於Proxy類,一個代理類只有一個實例域——調用處理器,它定義在Proxy的超類中。

所有的代理類都覆蓋了Object類中的方法toString、equals和hashCode。如同所有的代理方法一樣,這些方法僅僅調用了調用處理器的invoke。Object類的其他方法都沒有被重新定義。

沒有定義代理類的名字,sun虛擬機器中的Proxy類將生成一個以字串$Proxy開頭的類名。

代理類一定是public 和 final 。如果代理類實現的所有介面都是public,代理類就不屬於某個特定的包,否則,所有非公有的介面都必須屬於同一個包,同時,代理類也屬於這個包。

可以通過Proxy類中的isProxyClass方法檢測一個特定的Class物件是否代表一個代理類。

調用處理器必須給出處理調用的方法。

要想創建一個代理物件,需要使用Proxy類的newProxyInstance方法。這方法有三個參數

一個Class物件陣列,每個元素都是需要實現的介面

一個調用處理器。

這有兩個需要解決的問題

如何定義一個處理器?

能夠用結果代理物件做些什麼?

路由對遠端伺服器的方法調用

在程式運行期間,將使用者介面事件與動作關聯起來。

為調試,跟蹤方法調用

5.1 代理類的特性

代理類是在程式運行過程中創建的。

所有的代理類都擴展於Proxy類,一個代理類只有一個實例域——調用處理器,它定義在Proxy的超類中。

所有的代理類都覆蓋了Object類中的方法toString、equals和hashCode。如同所有的代理方法一樣,這些方法僅僅調用了調用處理器的invoke。Object類的其他方法都沒有被重新定義。

沒有定義代理類的名字,sun虛擬機器中的Proxy類將生成一個以字串$Proxy開頭的類名。

代理類一定是public 和 final 。如果代理類實現的所有介面都是public,代理類就不屬於某個特定的包,否則,所有非公有的介面都必須屬於同一個包,同時,代理類也屬於這個包。

可以通過Proxy類中的isProxyClass方法檢測一個特定的Class物件是否代表一個代理類。

Next Article
喜欢就按个赞吧!!!
点击关闭提示