匿名類
匿名類可以使你代碼更簡潔,它們使你能夠同時聲明和實例化一個類,它們就像局部類,除了它們沒有名稱,如果你只需要使用局部類一次,請使用它們。
聲明匿名類雖然局部類是類聲明,但匿名類是表達式,這意味著你在另一個表達式中定義該類,以下示例HelloWorldAnonymousClasses在局部變量frenchGreeting和spanishGreeting的初始化語句中使用匿名類,但使用局部類初始化變量englishGreeting:
public class HelloWorldAnonymousClasses { interface HelloWorld { public void greet(); public void greetSomeone(String someone); } public void sayHello() { class EnglishGreeting implements HelloWorld { String name = "world"; public void greet() { greetSomeone("world"); } public void greetSomeone(String someone) { name = someone; System.out.println("Hello " + name); } } HelloWorld englishGreeting = new EnglishGreeting(); HelloWorld frenchGreeting = new HelloWorld() { String name = "tout le monde"; public void greet() { greetSomeone("tout le monde"); } public void greetSomeone(String someone) { name = someone; System.out.println("Salut " + name); } }; HelloWorld spanishGreeting = new HelloWorld() { String name = "mundo"; public void greet() { greetSomeone("mundo"); } public void greetSomeone(String someone) { name = someone; System.out.println("Hola, " + name); } }; englishGreeting.greet(); frenchGreeting.greetSomeone("Fred"); spanishGreeting.greet(); } public static void main(String... args) { HelloWorldAnonymousClasses myApp = new HelloWorldAnonymousClasses(); myApp.sayHello(); } }匿名類的語法
如前所述,匿名類是表達式,匿名類表達式的語法類似于構(gòu)造函數(shù)的調(diào)用,除了代碼塊中包含類定義。
考慮frenchGreeting對象的實例化:
HelloWorld frenchGreeting = new HelloWorld() { String name = "tout le monde"; public void greet() { greetSomeone("tout le monde"); } public void greetSomeone(String someone) { name = someone; System.out.println("Salut " + name); } };
匿名類表達式包含以下內(nèi)容:
new運算符。
要實現(xiàn)的接口的名稱或要繼承的類,在此示例中,匿名類正在實現(xiàn)接口HelloWorld。
包含構(gòu)造函數(shù)參數(shù)的圓括號,就像普通的類實例創(chuàng)建表達式一樣,注意:實現(xiàn)接口時,沒有構(gòu)造函數(shù),因此你使用一對空括號,如本例所示。
類聲明體,更具體地說,類體中,方法聲明是允許的,但語句不是。
因為匿名類定義是表達式,所以它必須是語句的一部分,在此示例中,匿名類表達式是實例化frenchGreeting對象的語句的一部分(這解釋了為什么在閉合花括號后有一個分號)。
訪問封閉范圍的局部變量,以及聲明和訪問匿名類的成員與局部類一樣,匿名類可以捕獲變量,它們對封閉范圍的局部變量具有相同的訪問權(quán)限:
匿名類可以訪問其封閉類的成員。
匿名類無法訪問其封閉范圍中未聲明為final或者實際為final的局部變量。
與嵌套類一樣,匿名類中的類型(例如變量)的聲明會影響封閉范圍中具有相同名稱的任何其他聲明,有關(guān)更多信息,請參閱遮蔽。
匿名類對其成員也具有與局部類相同的限制:
你不能在匿名類中聲明靜態(tài)初始化或成員接口。
匿名類可以具有靜態(tài)成員,前提是它們是常量變量。
請注意,你可以在匿名類中聲明以下內(nèi)容:
字段
額外的方法(即使他們沒有實現(xiàn)超類型的任何方法)
實例初始化
局部類
但是,你不能在匿名類中聲明構(gòu)造函數(shù)。
匿名類的示例匿名類通常用于圖形用戶界面(GUI)應(yīng)用程序。
考慮JavaFX示例HelloWorld.java(來自Hello World的部分,來自JavaFX入門的JavaFX樣式),此示例創(chuàng)建一個包含Say "Hello World"按鈕的frame:
import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.StackPane; import javafx.stage.Stage; public class HelloWorld extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) { primaryStage.setTitle("Hello World!"); Button btn = new Button(); btn.setText("Say "Hello World""); btn.setOnAction(new EventHandler() { @Override public void handle(ActionEvent event) { System.out.println("Hello World!"); } }); StackPane root = new StackPane(); root.getChildren().add(btn); primaryStage.setScene(new Scene(root, 300, 250)); primaryStage.show(); } }
在此示例中,方法調(diào)用btn.setOnAction指定當你選擇Say "Hello World"按鈕時會發(fā)生什么,此方法需要EventHandler
因為EventHandler
匿名類是實現(xiàn)包含兩個或更多方法的接口的理想選擇,以下JavaFX示例來自UI控件的自定義部分,匿名類代碼創(chuàng)建一個只接受數(shù)值的文本字段,它通過重寫從TextInputControl類繼承的replaceText和replaceSelection方法,使用匿名類重新定義TextField類的默認實現(xiàn)。
import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Insets; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.layout.GridPane; import javafx.scene.layout.HBox; import javafx.stage.Stage; public class CustomTextFieldSample extends Application { final static Label label = new Label(); @Override public void start(Stage stage) { Group root = new Group(); Scene scene = new Scene(root, 300, 150); stage.setScene(scene); stage.setTitle("Text Field Sample"); GridPane grid = new GridPane(); grid.setPadding(new Insets(10, 10, 10, 10)); grid.setVgap(5); grid.setHgap(5); scene.setRoot(grid); final Label dollar = new Label("$"); GridPane.setConstraints(dollar, 0, 0); grid.getChildren().add(dollar); final TextField sum = new TextField() { @Override public void replaceText(int start, int end, String text) { if (!text.matches("[a-z, A-Z]")) { super.replaceText(start, end, text); } label.setText("Enter a numeric value"); } @Override public void replaceSelection(String text) { if (!text.matches("[a-z, A-Z]")) { super.replaceSelection(text); } } }; sum.setPromptText("Enter the total"); sum.setPrefColumnCount(10); GridPane.setConstraints(sum, 1, 0); grid.getChildren().add(sum); Button submit = new Button("Submit"); GridPane.setConstraints(submit, 2, 0); grid.getChildren().add(submit); submit.setOnAction(new EventHandler上一篇:局部類 下一篇:Lambda表達式() { @Override public void handle(ActionEvent e) { label.setText(null); } }); GridPane.setConstraints(label, 0, 1); GridPane.setColumnSpan(label, 3); grid.getChildren().add(label); scene.setRoot(grid); stage.show(); } public static void main(String[] args) { launch(args); } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/72441.html
Lambda表達式 匿名類的一個問題是,如果匿名類的實現(xiàn)非常簡單,例如只包含一個方法的接口,那么匿名類的語法可能看起來不實用且不清楚,在這些情況下,你通常會嘗試將功能作為參數(shù)傳遞給另一個方法,例如當有人單擊按鈕時應(yīng)采取的操作,Lambda表達式使你可以執(zhí)行此操作,將功能視為方法參數(shù),或?qū)⒋a視為數(shù)據(jù)。 上一節(jié)匿名類向你展示了如何在不給它命名的情況下實現(xiàn)基類,雖然這通常比命名類更簡潔,但對于只有一個...
嵌套類 Java編程語言允許你在另一個類中定義類,這樣的類稱為嵌套類,如下所示: class OuterClass { ... class NestedClass { ... } } 術(shù)語:嵌套類分為兩類:靜態(tài)和非靜態(tài),聲明為static的嵌套類稱為靜態(tài)嵌套類,非靜態(tài)嵌套類稱為內(nèi)部類。 class OuterClass { ... stati...
摘要:簡明教程原文譯者黃小非來源簡明教程并沒有沒落,人們很快就會發(fā)現(xiàn)這一點歡迎閱讀我編寫的介紹。編譯器會自動地選擇合適的構(gòu)造函數(shù)來匹配函數(shù)的簽名,并選擇正確的構(gòu)造函數(shù)形式。 Java 8 簡明教程 原文:Java 8 Tutorial 譯者:ImportNew.com - 黃小非 來源:Java 8簡明教程 ? Java并沒有沒落,人們很快就會發(fā)現(xiàn)這一點 歡迎閱讀我編寫的Java ...
摘要:如果這個靜態(tài)變量在生命周期結(jié)束后沒有清空,就導(dǎo)致內(nèi)存泄漏。因此造成內(nèi)存泄露。注冊沒取消造成的內(nèi)存泄露這種的內(nèi)存泄露比純的內(nèi)存泄漏還要嚴重,因為其他一些程序可能引用系統(tǒng)的程序的對象比如注冊機制。 原文鏈接 更多教程 為什么會發(fā)生內(nèi)存泄漏 內(nèi)存空間使用完畢之后未回收, 會導(dǎo)致內(nèi)存泄漏。有人會問:Java不是有垃圾自動回收機制么?不幸的是,在Java中仍存在很多容易導(dǎo)致內(nèi)存泄漏的邏輯(...
閱讀 1617·2021-11-22 14:45
閱讀 1063·2021-11-17 09:33
閱讀 3322·2021-09-02 09:48
閱讀 970·2019-08-30 15:54
閱讀 2767·2019-08-30 15:53
閱讀 2553·2019-08-30 12:54
閱讀 2241·2019-08-29 12:37
閱讀 2421·2019-08-26 13:58