文章編號:11615時間:2024-10-01人氣:
匿名內部類是 Java 中一個有用的特性,它允許我們創建沒有名稱的類。這在事件處理中很有用,因為它可以讓我們快速創建響應特定事件的類。
匿名內部類最常用于以下情況:
下面是一個使用匿名內部類創建按鈕單擊事件處理程序的示例:
import java.awt.event.ActionEvent;import java.awt.event.ActionListener;public class ButtonExample {public static void main(String[] args) {// 創建一個按鈕JButton button = new JButton("單擊我");// 添加一個匿名內部類作為按鈕單擊事件處理程序button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("按鈕被單擊了!");}});}}
在這個示例中,我們創建了一個匿名內部類來處理按鈕單擊事件。這個類實現了 ActionListener 接口,該接口有一個方法 actionPerformed(),它將在按鈕被單擊時被調用。
使用匿名內部類時,請遵循以下最佳實踐:
匿名內部類是 Java 中一個強大的工具,它可以用來創建響應迅速且代碼整潔的應用程序。通過遵循最佳實踐,我們可以有效地利用匿名內部類來處理事件。
匿名類可以使你的代碼更加簡潔 (JDK8之后Lambda更簡潔)。
定義一個類的同時對其進行實例化。
它與局部類很相似,不同的是它沒有類名,如果某個局部類你只需要使用一次,就可以使用匿名類代替局部類。
匿名類是表達式,而非常規的類
匿名類的使用場景:一個局部類只需要使用一次的時候
由于匿名類沒有類名,那么除了定義它的地方,其他地方無法調用,所以匿名類也可以叫匿名內部類
匿名類實現HelloWorld接口并創建了實例化對象:frenchGreeting */ HelloWorld frenchGreeting = new HelloWorld() { String name = 無參;
@Override public void greet() { greetSomeone(name); }
@Override public void greetSomeone(String someone) { name = someone; (匿名類: + name); } };
// 匿名類:無參方法 (); // 匿名類:帶參方法 (帶參);
###匿名類繼承父類 (匿名子類)```jspublic class ExtendTest {public static void main(String[] args) {String name = 李四;// 創建父類對象,打印原始name值PartherClass partherClass = new PartherClass();(父類的getName方法= + ());// 使用匿名類繼承父類,并打印name值PartherClass pc = new PartherClass(name){@Overridepublic String getName(){return 匿名類 - +();}};(());}}class PartherClass{private String name = 張三;public PartherClass(){}public PartherClass(String name){ = name;}public String getName(){return ;}}局部類public class HelloWorldAnonymousClasses {interface HelloWorld {public void greet();public void greetSomeone(String someone);}/** * 1、局部類:EnglishGreeting實現了HelloWorld接口 */class EnglishGreeting implements HelloWorld {String name = 無參;@Overridepublic void greet() {greetSomeone(name);}@Overridepublic void greetSomeone(String someone) {name = someone;(局部類: + name);}}// 創建局部類EnglishGreeting的實例化對象,使用接口類型接收HelloWorld englishGreeting = new EnglishGreeting();// 局部類:無參方法();// 局部類:帶參方法(帶參);匿名類的擴展:Java的lambda表達式 (Lambda表達式本身就是一個接口的實現)Lambda 表達式的作用其實就是匿名方法,而 Java 中并沒有匿名方法這一語法。 不過 Java 中有匿名對象, 當你直接 new 一個接口并實現接口方法的時候,Java 編譯器實際是產生了一個類(匿名類)來實現這個接口,然后再返回這個類的一個實例, 也就是匿名對象;
匿名類實現方式:@FunctionalInterfaceinterface HelloWorldFunction {void doSomeWork();}//new 一個接口并實現接口方法的時候,Java 編譯器實際是產生了一個類 匿名類 來實現這個接口staticHelloWorldFunction helloWorldFunction = new HelloWorldFunction() {@Overridepublic void doSomeWork() {(doSomeWork--);}};函數式編程實現方式:static HelloWorldFunction helloWorldFunction = ()-> (doSomeWork--);箭頭函數(箭頭函數就是lambda表達式,提供了更簡潔的function定義方式)Lambda 表達式的主要形式是如下定義,符號的左側是參數,右側是表達式或語句塊。(參數列表) => { 語句塊 }(參數列表) => 語句// 一條語句java lamda 表達式(將匿名函數復制給變量的簡寫方式的函數稱為 lambda 表達式**。)@FunctionalInterfacepublic interface WorkerInterface {public void doSomeWork();}public class WorkerInterfaceTest {public static void execute(WorkerInterface worker) {();}public static void main(String [] args) {//invoke doSomeWork using Annonymous classexecute(new WorkerInterface() {@Overridepublic void doSomeWork() {(Worker invoked using Anonymous class);}});//invoke doSomeWork using Lambda expressionexecute( () -> (Worker invoked using Lambda expression) );}}函數式接口
1)Java8中Iterable的foreach(Comsumer action)的函數式接口 2)Java8中Iteror的forEachRemaining(Comsumer action)的函數式接口 3)Java8中函數式接口Predicate;Collections的removeIf(Predicate filter)
javascript 箭頭函數var fun1 = funcation(int x,int y){return (x+y);}簡寫如下:
var fun1 = (x,y)=>x+y;結論:- 箭頭函數適合于無復雜邏輯或者無副作用的純函數場景下,例如用在map、reduce、filter的回調函數定義中;不要在最外層定義箭頭函數,因為在函數內部操作this會很容易污染全局作用域。最起碼在箭頭函數外部包一層普通函數,將this控制在可見的范圍內;
參考:02、Java的lambda表達式和JavaScript的箭頭函數 - 掘金 ()
原文:分類:電腦/網絡 >> 程序設計 >> 其他編程語言 問題描述: 內部類的使用有什么優點,什么情況下應考慮使用它呢? 匿名類使用有什么優點,什么情況下應考慮使用它呢? 解析: 提起Java內部類(Inner Class)可能很多人不太熟悉,實際上類似的概念在C++里也有,那就是嵌套類(Nested Class),關于這兩者的區別與聯系,在下文中會有對比。 內部類從表面上看,就是在類中又定義了一個類(下文會看到,內部類可以在很多地方定義),而實際上并沒有那么簡單,乍看上去內部類似乎有些多余,它的用處對于初學者來說可能并不是那么顯著,但是隨著對它的深入了解,你會發現Java的設計者在內部類身上的確是用心良苦。 學會使用內部類,是掌握Java高級編程的一部分,它可以讓你更優雅地設計你的程序結構。 下面從以下幾個方面來介紹: 第一次見面public interface Contents { int value(); } public interface Destination { String readLabel(); } public class Goods { private class Content implements Contents { private int i = 11; public int value() { return i; } } protected class GDestination implements Destination { private String label; private GDestination(String whereTo) { label = whereTo; } public String readLabel() { return label; } } public Destination dest(String s) { return new GDestination(s); } public Contents cont() { return new Content(); } } class TestGoods { public static void main(String[] args) { Goods p = new Goods(); Contents c = (); Destination d = (Beijing); } } 在這個例子里類Content和GDestination被定義在了類Goods內部,并且分別有著protected和private修飾符來控制訪問級別。 Content代表著Goods的內容,而GDestination代表著Goods的目的地。 它們分別實現了兩個接口Content和Destination。 在后面的main方法里,直接用 Contents c和Destination d進行操作,你甚至連這兩個內部類的名字都沒有看見!這樣,內部類的第一個好處就體現出來了——隱藏你不想讓別人知道的操作,也即封裝性。 同時,我們也發現了在外部類作用范圍之外得到內部類對象的第一個方法,那就是利用其外部類的方法創建并返回。 上例中的cont()和dest()方法就是這么做的。 那么還有沒有別的方法呢?當然有,其語法格式如下: outerObject=new outerClass(Constructor Parameters); innerObject= InnerClass(Constructor Parameters); 注意在創建非靜態內部類對象時,一定要先創建起相應的外部類對象。 至于原因,也就引出了我們下一個話題—— 非靜態內部類對象有著指向其外部類對象的引用 對剛才的例子稍作修改: public class Goods { private valueRate=2; private class Content implements Contents { private int i = 11*valueRate; public int value() { return i; } } protected class GDestination implements Destination { private String label; private GDestination(String whereTo) { label = whereTo; } public String readLabel() { return label; } } public Destination dest(String s) { return new GDestination(s); } public Contents cont() { return new Content(); } } 修改的部分用藍色顯示了。 在這里我們給Goods類增加了一個private成員變量valueRate,意義是貨物的價值系數,在內部類Content的方法value()計算價值時把它乘上。 我們發現,value()可以訪問valueRate,這也是內部類的第二個好處——一個內部類對象可以訪問創建它的外部類對象的內容,甚至包括私有變量!這是一個非常有用的特性,為我們在設計時提供了更多的思路和捷徑。 要想實現這個功能,內部類對象就必須有指向外部類對象的引用。 Java編譯器在創建內部類對象時,隱式的把其外部類對象的引用也傳了進去并一直保存著。 這樣就使得內部類對象始終可以訪問其外部類對象,同時這也是為什么在外部類作用范圍之外向要創建內部類對象必須先創建其外部類對象的原因。 有人會問,如果內部類里的一個成員變量與外部類的一個成員變量同名,也即外部類的同名成員變量被屏蔽了,怎么辦?沒事,Java里用如下格式表達外部類的引用: 有了它,我們就不怕這種屏蔽的情況了。 靜態內部類 和普通的類一樣,內部類也可以有靜態的。 不過和非靜態內部類相比,區別就在于靜態內部類沒有了指向外部的引用。 這實際上和C++中的嵌套類很相像了,Java內部類與C++嵌套類最大的不同就在于是否有指向外部的引用這一點上,當然從設計的角度以及以它一些細節來講還有區別。 除此之外,在任何非靜態內部類中,都不能有靜態數據,靜態方法或者又一個靜態內部類(內部類的嵌套可以不止一層)。 不過靜態內部類中卻可以擁有這一切。 這也算是兩者的第二個區別吧。 局部內部類 是的,Java內部類也可以是局部的,它可以定義在一個方法甚至一個代碼塊之內。 public class Goods1 { public Destination dest(String s) { class GDestination implements Destination { private String label; private GDestination(String whereTo) { label = whereTo; } public String readLabel() { return label; } } return new GDestination(s); } public static void main(String[] args) { Goods1 g= new Goods1(); Destination d = (Beijing); } } 上面就是這樣一個例子。 在方法dest中我們定義了一個內部類,最后由這個方法返回這個內部類的對象。 如果我們在用一個內部類的時候僅需要創建它的一個對象并創給外部,就可以這樣做。 當然,定義在方法中的內部類可以使設計多樣化,用途絕不僅僅在這一點。 下面有一個更怪的例子: public class Goods2{ private void internalTracking(boolean b) { if(b) { class TrackingSlip { private String id; TrackingSlip(String s) { id = s; } String getSlip() { return id; } } TrackingSlip ts = new TrackingSlip(slip); String s = (); } } public void track() { internalTracking(True); } public static void main(String[] args) { Goods2 g= new Goods2(); (); } } 你不能在if之外創建這個內部類的對象,因為這已經超出了它的作用域。 不過在編譯的時候,內部類TrackingSlip和其他類一樣同時被編譯,只不過它由它自己的作用域,超出了這個范圍就無效,除此之外它和其他內部類并沒有區別。 匿名內部類 java的匿名內部類的語法規則看上去有些古怪,不過如同匿名數組一樣,當你只需要創建一個類的對象而且用不上它的名字時,使用內部類可以使代碼看上去簡潔清楚。 它的語法規則是這樣的: new interfacename(){......}; 或 new superclassname(){......}; 下面接著前面繼續舉例子: public class Goods3 { public Contents cont(){ return new Contents(){ private int i = 11; public int value() { return i; } }; } } 這里方法cont()使用匿名內部類直接返回了一個實現了接口Contents的類的對象,看上去的確十分簡潔。 在java的事件處理的匿名適配器中,匿名內部類被大量的使用。 例如在想關閉窗口時加上這樣一句代碼: (new WindowAdapter(){ public void windowClosing(WindowEvent e){ (0); } }); 有一點需要注意的是,匿名內部類由于沒有名字,所以它沒有構造函數(但是如果這個匿名內部類繼承了一個只含有帶參數構造函數的父類,創建它的時候必須帶上這些參數,并在實現的過程中使用super關鍵字調用相應的內容)。 如果你想要初始化它的成員變量,有下面幾種方法: 如果是在一個方法的匿名內部類,可以利用這個方法傳進你想要的參數,不過記住,這些參數必須被聲明為final。 將匿名內部類改造成有名字的局部內部類,這樣它就可以擁有構造函數了。 在這個匿名內部類中使用初始化代碼塊。 為什么需要內部類? java內部類有什么好處?為什么需要內部類? 首先舉一個簡單的例子,如果你想實現一個接口,但是這個接口中的一個方法和你構想的這個類中的一個方法的名稱,參數相同,你應該怎么辦?這時候,你可以建一個內部類實現這個接口。 由于內部類對外部類的所有內容都是可訪問的,所以這樣做可以完成所有你直接實現這個接口的功能。 不過你可能要質疑,更改一下方法的不就行了嗎? 的確,以此作為設計內部類的理由,實在沒有說服力。 真正的原因是這樣的,java中的內部類和接口加在一起,可以的解決常被C++程序員抱怨java中存在的一個問題——沒有多繼承。 實際上,C++的多繼承設計起來很復雜,而java通過內部類加上接口,可以很好的實現多繼承的效果。 本文的目的只是向大家介紹一下內部類的概念以及使用方法,在后續文章里,將會針對本文中的內容舉更多具體的例子,以及介紹如何使用內部類構建一個Applicaton Framework。
//匿名內部類甚至沒有類名,(實際上有).所以匿名內部類,只有一個實例,而且沒有引用.如下面那個Thread類的匿名子類,你不能重復使用.內部類,內部類有名字,但是他在類的內部.他能訪問外部類的所有數據,包括private的.甚至如果一個內部類,是在一個方法內的話,方法的局部變量,內部類也可以使用.總體來說匿名內部類,和內部類效果差別不大.在事件監聽和線程應用中經常使用.//匿名內部類public class T1 { public static void main(String[] args) {new Thread() { public void run() {(runing); }}(); }}//內部嵌套類public class T1 { private static final class Thread1 extends Thread {public void run() { (runing);} } public static void main(String[] args) {new Thread1()(); }}
java匿名內部類一定是在new的后面,用其隱含實現一個接口或實現一個類,沒有類名,根據多態,我們使用其父類名。 因他是局部內部類,那么局部內部類的所有限制都對其生效。 匿名內部類是唯一一種無構造方法類。 大部分匿名內部類是用于接口回調用的。 匿名內部類在編譯的時候由系統自動起名Out$。 如果一個對象編譯時的類型是接口,那么其運行的類型為實現這個接口的類。 因匿名內部類無構造方法,所以其使用范圍非常的有限。 當需要多個對象時使用局部內部類,因此局部內部類的應用相對比較多。 匿名內部類中不能定義構造方法。 如果一個對象編譯時的類型是接口,那么其運行的類型為實現這個接口的類。
示例如下:
顧名思義,沒有名字的內部類。 表面上看起來它們似乎有名字,實際那不是它們的名字。 當程序中使用匿名內部類時,在定義匿名內部類的地方往往直接創建該類的一個對象。 匿名內部類的聲明格式如下:new ParentName(){...// 內部類的定義} 匿名內部類就是沒有名字的內部類。 什么情況下需要使用匿名內部類?如果滿足下面的一些條件,使用匿名內部類是比較合適的:·只用到類的一個實例 。 ·類在定義后馬上用到。 ·類非常小(SUN推薦是在4行代碼以下)·給類命名并不會導致你的代碼更容易被理解。 在使用匿名內部類時,要記住以下幾個原則:·匿名內部類不能有構造方法。 ·匿名內部類不能定義任何靜態成員、靜態方法。 ·匿名內部類不能是public,protected,private,static。 ·只能創建匿名內部類的一個實例。 ·一個匿名內部類一定是在new的后面,用其隱含實現一個接口或實現一個類。 ·因匿名內部類為局部內部類,所以局部內部類的所有限制都對其生效。 A、繼承式的匿名內部類public class Car {public void drive(){(Driving a car!);}public static void main(String[] args) {Car car = new Car(){public void drive() {(Driving another car!);}};();}}結果輸出了:Driving another car! Car引用變量不是引用Car對象,而是Car匿名子類的對象。 B、接口式的匿名內部類。 interface Vehicle {public void drive();}class Test{public static void main(String[] args) {Vehicle v = new Vehicle(){public void drive(){(Driving a car!);}};();}}上面的代碼很怪,好像是在實例化一個接口。 事實并非如此,接口式的匿名內部類是實現了一個接口的匿名類。 而且只能實現一個接口。 C、參數式的匿名內部類。 class Bar{void doStuff(Foo f){();}}interface Foo{void foo();}class Test{static void go(){Bar b = new Bar();(new Foo(){public void foo(){(foofy);}});}}
內容聲明:
1、本站收錄的內容來源于大數據收集,版權歸原網站所有!
2、本站收錄的內容若侵害到您的利益,請聯系我們進行刪除處理!
3、本站不接受違法信息,如您發現違法內容,請聯系我們進行舉報處理!
4、本文地址:http://m.sycxjdsbhs.com/article/ea1cb5c19836813a684f.html,復制請保留版權鏈接!
TPShop是一套功能強大、開源且免費的電子商務系統,為企業提供了構建和管理在線商店所需的全部工具,得益于其強大的技術、直觀的界面和出色的支持,TPShop已成為全球數千家企業首選的電子商務解決方案,領先的電子商務技術TPShop采用了一系列先進的技術,旨在提供卓越的性能和用戶體驗,微服務架構,TPShop采用微服務架構,將復雜的電子...。
本站公告 2024-09-29 17:54:54
引言數學是一個以抽象概念為基礎的學科,這些概念可能對學習者來說難以理解,數棧是理解數學基礎的一個重要工具,它可以幫助學生將復雜的問題分解成更容易理解的步驟,什么是數棧,數棧是一種數據結構,它遵循后進先出,LIFO,原則,即最后添加的元素將第一個被刪除,與隊列不同,隊列遵循先進先出,FIFO,原則,數??捎糜诮鉀Q各種數學問題,包括,求解...。
互聯網資訊 2024-09-26 02:00:53
簡介InArray是一種數據庫索引,它允許使用數組中的元素進行快速查找,與傳統索引相比,InArray提供了以下優勢,增強查詢速度,InArray可以顯著提高包含數組條件的查詢速度,提高數據完整性,InArray有助于確保數據的準確性和一致性,InArray的工作原理InArray是一個特殊的索引,它存儲了表中數組列中的所有元素,當執...。
互聯網資訊 2024-09-24 22:21:51
在醫療保健行業,安全地共享患者記錄、掃描件和圖像至關重要,醫療專業人員需要能夠輕松、安全地訪問患者的醫療信息,以便提供最佳護理,傳統的醫療保健數據共享方法通常涉及傳真或郵寄患者記錄,這些方法不僅耗時、不安全,而且還可能導致患者信息丟失或被盜,隨著技術的發展,出現了新的方法來安全地共享患者記錄,其中一種方法是使用安全的云存儲平臺,這些平...。
互聯網資訊 2024-09-23 16:28:03
在PHP中,四舍五入是一個常見的操作,但如果處理不當,可能會導致意外的結果,為什么四舍五入會出現問題,PHP中四舍五入最常見的陷阱源于浮點運算誤差,浮點運算是一種近似計算,可能會導致微小的誤差,從而影響四舍五入的結果,避免陷阱的方法1.使用PHP的內置函數PHP提供了一系列內置函數用于四舍五入,這些函數可以處理浮點運算誤差,`roun...。
本站公告 2024-09-23 11:20:07
Java工作流的實踐,真實世界的示例和案例研究概述工作流是一個自動化的過程,它將復雜的任務分解為一系列較小的步驟,Java工作流為開發基于Java的健壯且可擴展的工作流提供了強大的框架,通過使用工作流,開發人員可以輕松地協調不同的系統、服務和任務,從而提高效率和生產力,真實世界的示例訂單處理一個經典的Java工作流示例是訂單處理,該工...。
技術教程 2024-09-12 06:37:06
簡介本教程將帶你深入了解代碼架構,它不僅會影響軟件的性能和可維護性,還會影響其長期發展,課程目標了解代碼架構的基本原則學習不同的代碼架構模式掌握如何設計和實現高質量的代碼架構課程內容模塊1,代碼架構基礎什么是代碼架構代碼架構的重要性代碼架構的原則模塊2,代碼架構模式單體架構微服務架構分層架構MVC架構模塊3,設計高質量代碼架構設計原則...。
最新資訊 2024-09-10 05:32:03
前言隨著全球化進程的不斷推進,翻譯的需求也日益增長,對于需要翻譯文檔或軟件的人來說,一個常見的問題是,是使用翻譯文檔還是翻譯軟件,本文將對這兩種方法進行比較,幫助您做出明智的決定,翻譯文檔翻譯文檔是指將一種語言的文檔翻譯成另一種語言,這通常由專業翻譯人員手動完成,他們精通兩種或兩種以上語言并了解目標受眾的文化和語言習慣,優點,準確性,...。
互聯網資訊 2024-09-09 16:15:14
HTML超文本標記語言,HTML,是Web開發的基礎,它是構建網頁結構的骨架,允許您創建標題、段落、列表和鏈接等元素,要創建基本網頁,您需要了解HTML標簽,例如,<,html>,<,head>,<,title>,我的第一個網頁<,title>,<,head>,<,body>,<...。
本站公告 2024-09-08 13:39:04
織夢,DedeCMS,是一種流行的中文內容管理系統,CMS,,用于創建和管理網站,隨著網絡威脅的不斷演變,確??棄艟W站的安全至關重要,本指南將介紹一系列全面的措施,幫助您防范網絡威脅,保護您的網站數據和用戶,更新和補丁定期更新織夢系統和插件,安全補丁經常發布,修復已知漏洞并提高安全性,使用官方渠道獲取更新,以避免下載惡意軟件或后門,設...。
最新資訊 2024-09-06 15:50:09
JavaScript的substring,方法是一個強大的工具,可用于從字符串中提取子字符串,此方法有兩種語法變體,本文將詳細介紹這兩種變體以及它們的實際應用,語法第一種語法```substring,start,end,```start,從該索引開始提取子字符串的起始位置,如果未指定,則默認為0,表示字符串的開頭,end,提取子字符...。
最新資訊 2024-09-06 08:50:00
北京375路公交車是一個連接北京市東城區和西城區的交通路線,它在運營過程中曾發生過多起令人毛骨悚然的靈異事件,這些事件引起了公眾的廣泛關注和議論,官方調查對于375路公交車上的靈異事件,北京交通部門曾多次組織調查,2012年,交通部門對公交車司機和乘客進行了走訪調查,結果顯示,的確有部分人聲稱在乘車過程中經歷過靈異事件,例如看到不明物...。
互聯網資訊 2024-09-05 01:44:10