Java03接口與內部類

6 接口與內部類

接口 interface

對象克隆

內部類 inner class

代理 proxy

?

6.1 接口

public interface Comparable<T>
{int compareTo(T other);
}


Arrays.sort(Object[] a) 利用的是mergesort

?

接口也可以被擴展

public interface Moveable
{void move(double x, double y);
}
public interface Powered extends Moveable
{double milesPerGallon();  //public abstractdouble SPEED_LIMIT = 95; //public static final
}


標準庫中的SwingConstants接口只包含NORTHSOUTHHORIZOTAL等常量,任何實現此接口的類都自動繼承了這些常量。

class Employee implements Cloneable, Comparable

?

6.2 對象克隆

Objectclone()protected,默認淺拷貝。

?

實現Cloneable接口(空接口,標記用)

使用public訪問修飾符重新定義clone方法

?

標記接口的唯一作用,可以使用instanceof進行類型檢查

class Employ implements Cloneable
{public Employ clone() throws CloneNotSupportedException{...}
}

只要在clone中含有未實現Cloneable接口的對象,Object類的clone方法就會拋出一個CloneNotSupportException異常。

如果是final類,也可不拋異常,而是try-catch

?

6.3 接口與回調

回調(call back)是一種常見的設計模式。可以指出某個特定事件發生時應該采取的動作。

?

public interface ActionListener

{

void actionPerformed(ActionEvent event);

}

?

class TimePrinter implements ActionListener{ }

new Timer(1000, new TimePrinter()).start(); ?

//Timer構造器的第一個參數是發出通告的時間間隔,單位是毫秒;第二個是監聽器對象,在時間到后執行actionPerformed()

?

javax.swing.JOptionPane

static void showMessageDialog(Component parent, Object message)

如果parentnull,則在中央顯示

javax.swing.Timer

Timer(int interval, ActionListener listener)

void start()

void stop()

java.awt.Toolkit

void beep()

?

6.4 內部類

定義在另一個類中的類。

使用原因:

內部類方法可以訪問該類定義所在的作用域中的數據,包括私有的數據

內部類可以對同一個包中的其他類隱藏起來

當想定義一個回調函數時,使用匿名內部類比較便捷

?

內部類中添加了一個外圍類引用的參數 OuterClass.this

在外部類外引用公開內部類OuterClass.InnerClass

?

內部類是一種編譯器現象,與虛擬機無關。

編譯器將內部類翻譯成用$分隔外部類名與內部類名的常規類文件,虛擬機對此一無所知

OuterClass$InnerClass

編譯器為了引用外圍類,生成了一個附加的實例域final OuterClass this$0

外圍類將添加靜態方法 static boolean access$0(OuterClass)InnerClass將調用此方法來訪問外部類的私有域。

?

?

局部內部類不能用publicprivate訪問說明符進行聲明

它的作用域被限定在聲明這個局部類的塊中

優勢:對外部世界可以完全隱藏起來

可以訪問外部類,和被聲明為final的局部變量

?

匿名內部類?anonymous inner class

InnerClass ic = new InnerClass(){ 類的實現 };

InnerClass可以是一個接口,類內實現接口方法

只創建類的一個對象

?

靜態內部類

只是為了把一個類隱藏在另一個類的內部,并不需要內部類引用外圍類對象

static 進行聲明

?

6.5 代理

在運行時創建一個實現了一組給定接口的新類。

這種功能在編譯時無法確定需要實現哪個接口時才有必要使用。

?

應用場景:

一個接口,其確切類型在編譯時無法知道。

需要在程序運行狀態定義一個實現這些接口的新類。

?

方案一:

生成代碼,將代碼放置在一個文件中,調用編譯器進行編譯,然后再加載結果類文件。

方案二:

代理機制,在運行時創建全新的類。這樣的代理類能夠實現指定接口。

指定接口有如下方法:

指定接口所需的全部方法;

Object類中的全部方法:toString equals hashcode

?

方法:

1、定義調用處理器(invocation handler),包裝基本類對象。

調用處理器是實現了InvocationHandler接口的類對象。在這個接口中只用一個方法:

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

當調用代理對象的方法時,調用處理器的invoke方法都會被調用,并向其傳遞Method對象和原始的調用參數,調用處理器給出處理調用的方式。

2、創建代理對象。

使用Proxy類的newProxyInstance方法,有三個參數:

一個類加載器、一個class對象數組(每個元素都是需要實現的接口)、一個調用處理器

?

例:

public interface Run
{void run();
}
public class Animal implements Run
{@Overridepublic void run(){System.out.println("Animal is running");}
}
public RunHandler implements InvocationHandler
{private Object target;public RunHandler(Object target){this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args){System.out.println("Proxy is running");return method.invoke(target, args);}
}

Animal animal = new Animal(); //基本類對象
InvocationHandler handler = new RunHandler(animal); //封裝基本類對象
//handler封裝的是實現Run接口的類對象。
Object proxy = Proxy.newProxyInstance(Run.class.getClassLoader(), new Class[]{Run.class}, handler);
(Run)proxy.run(); //此時代理對象proxy可以調用Run接口的方法。


代理的特性:

代理類是在運行過程中創建的,一旦被創建,就變成常規類,與虛擬機中的任何其他類沒有區別。

所有代理類都擴展于Proxy類。

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

為了履行代理對象的職責,所需要的任何附加數據都必須存儲在調用處理器中。

?

代理類覆蓋了Object類中的方法toString equals hashCode,這些方法調用了調用處理器的invoke

Object類的clonegetClass沒有被重新定義。

?

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

對于特定類的加載器和預設的一組接口來說,只能有一個代理類。即,如果使用同一個類加載器和接口數組調用了兩次newInstance方法的話,那么只能得到同一個類的兩個對象。

可以用Class proxyClass = Proxy.getProxyClass(null, interfaces);

代理類一定是publicfinal

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

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387305.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387305.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387305.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第一節:ASP.NET開發環境配置

第一節&#xff1a;ASP.NET開發環境配置 什么是ASP.NET&#xff0c;學這個可以做什么&#xff0c;學習這些有什么內容&#xff1f; ASP.NET是微軟公司推出的WEB開發技術。 2002年&#xff0c;推出第一個版本&#xff0c;先后推出ASP.NET2.0&#xff0c;和ASP.NET3.5&#xff0c…

深度學習筆記之win7下TensorFlow的安裝

最近要學習神經網絡相關的內容&#xff0c;所以需要安裝TensorFlow。不得不說&#xff0c;安裝TensorFlow的感受就像是大一剛入學學習C語言時&#xff0c;安裝vs時一樣&#xff0c;問題一大堆&#xff0c;工具都裝不好&#xff0c;還學啥呀。好在&#xff0c;就在昨晚&#xff…

Java04異常、斷言、日志和調試

11 異常、斷言、日志和調試 異常處理&#xff08;exception handing&#xff09; 使用斷言來啟動檢測 Java日志框架 調試技巧 11.1 處理錯誤 如果一個方法不能夠采用正常的途徑完成任務&#xff0c;就通過另外一個路徑退出方法。 在這種情況下&#xff0c;方法不返回任何…

全雙工與半雙工的區別

1、全雙工傳輸 (英文Full&#xff0d;Duplex &#xff09; 是指交換機在發送數據的同時也能夠接收數據&#xff0c;兩者同步進行&#xff0c;這好像我們平時打電話一樣&#xff0c;說話的同時也能夠聽到對方的聲音。目前的交換機都支持全雙工。全雙工的好處在于遲延小&#xff…

人臉識別經典算法一:特征臉方法(Eigenface)

這篇文章是擼主要介紹人臉識別經典方法的第一篇&#xff0c;后續會有其他方法更新。特征臉方法基本是將人臉識別推向真正可用的第一種方法&#xff0c;了解一下還是很有必要的。特征臉用到的理論基礎PCA在另一篇博客里&#xff1a;特征臉(Eigenface)理論基礎-PCA(主成分分析法)…

Java05泛型

12 泛型 12.1 為什么使用泛型 泛型程序設計&#xff08;Generic programming&#xff09;&#xff1a;意味著編寫的代碼可以被很多不同類型的對象所重用。 類型參數&#xff08;type parameters&#xff09; 通配符類型&#xff08;wildcard type&#xff09; 可以將Manage…

bitmap轉換為drawable

Bitmap bitmap MediaStore.Images.Media.getBitmap(this, Uri.parse(string)); Drawable drawable new BitmapDrawable(bitmap);// 這樣就轉換成drawable格式&#xff0c;可以設置背景圖片了轉載于:https://www.cnblogs.com/Nigeria/p/10471028.html

numpy的下載與安裝教程——(解決No module named numpy問題)

NumPy函數庫是Python開發環境的一個獨立模塊&#xff0c;而且大多數Python發行版沒有默認安裝NumPy數據庫&#xff0c;因此在安裝Python之后必須單獨安裝NumPy數據庫。 進入Python shell開發環境后輸入 [python] view plaincopy from numpy import* 如果出現No module named …

Xception

The First ColumnThe Second Columnpadding 方式&#xff1a;same and valid The First ColumnThe Second ColumnSame 就是 增加一列相同的數 &#xff08;一般是0&#xff09;valid只保留有效的轉載于:https://www.cnblogs.com/hugeng007/p/10477430.html

1.蒼穹外賣-day01

蒼穹外賣-day01 課程內容 軟件開發整體介紹 蒼穹外賣項目介紹 開發環境搭建 導入接口文檔 Swagger 項目整體效果展示&#xff1a; 管理端-外賣商家使用 用戶端-點餐用戶使用 當我們完成該項目的學習&#xff0c;可以培養以下能力&#xff1a; 1. 軟件開發整體介紹 作為一名…

7 用戶和用戶組

7.1 用戶配置文件 7.1.1 用戶信息文件 /etc/passwd man 5 passwd 查看配置文件功能 第1字段&#xff1a; 用戶名稱 第2字段&#xff1a; 密碼標志 X代表有密碼 如果用戶沒有密碼&#xff0c;則只允許本地登錄 第3字段&#xff1a; UID&#xff08;用戶ID&#xff09; 0…

C#調用Python模塊

編程&#xff1a;C#調用Python模塊 當下&#xff0c;C#與Python都是比較熱門的計算機編程語言&#xff0c;他們各有優缺點&#xff0c;如果能讓他們互相配合工作&#xff0c;那是多么美好的事情&#xff0c;今天我來講解一下如何利用C#來調用Python。 如果讓C#支持調用Python模…

面試簡單整理之克隆

61.為什么要使用克隆&#xff1f; 克隆獲取對象的副本&#xff0c;直接用復制還是一個引用。 62.如何實現對象克隆&#xff1f; 1.被clone的類實現cloneable接口&#xff0c;重寫object類的clone&#xff08;&#xff09;方法 2.如果深克隆則克隆對象的引用對象也要實現接口、重…

8 權限管理

8.1 ACL權限 8.1.1 簡介與開啟 用于解決身份不夠用的問題 ACL(access control list) 訪問控制表 ACL是存在于計算機中的一張表&#xff0c;它使操作系統明白每個用戶對特定系統對象&#xff0c;例如文件目錄或單個文件的存取權限。 這張表對于每個系統用戶有擁有一個訪問…

windows下GitHub的SSH Key 配置

https://www.jianshu.com/p/9317a927e844轉載于:https://www.cnblogs.com/lishidefengchen/p/10481889.html

PyCharm調試錯誤

JetBrains PyCharm 2017.3.2 這就說明python.exe的環境沒有配&#xff0c;點擊藍色的configure Python Interpreter&#xff0c;然后選擇對應的路徑就可以了

Java06集合

13 集合 實現方法時&#xff0c;不同的數據結構會導致性能有很大差異。 13.1 集合接口 Java集合類庫將接口&#xff08;interface&#xff09;與實現&#xff08;implementation&#xff09;分離。 可以使用接口類型存放集合的應用&#xff0c;一旦改變了想法&#xff0c;可…

Tensorflow驗證碼識別應用

簡單的Tensorflow驗證碼識別應用&#xff0c;供大家參考&#xff0c;具體內容如下 1.Tensorflow的安裝方式簡單,在此就不贅述了. 2.訓練集訓練集以及測試及如下(純手工打造,所以數量不多): 3.實現代碼部分(參考了網上的一些實現來完成的) main.py(主要的神經網絡代碼) ?123456…

9 文件系統管理

9.1 回顧分區和文件系統 分區類型 主分區&#xff1a;總共最多只能分四個 擴展分區&#xff1a;只能有一個&#xff0c;主分區加擴展分區最多有四個&#xff0c;必須再劃分成邏輯分區才能使用。 邏輯分區&#xff1a;在擴展分區中劃分的 IDE硬盤最多支持59個邏輯分區 SCSI…

Linux 桌面玩家指南:09. X Window 的奧秘

Linux 桌面玩家指南&#xff1a;09. X Window 的奧秘 原文:Linux 桌面玩家指南&#xff1a;09. X Window 的奧秘特別說明&#xff1a;要在我的隨筆后寫評論的小伙伴們請注意了&#xff0c;我的博客開啟了 MathJax 數學公式支持&#xff0c;MathJax 使用$標記數學公式的開始和結…