成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java? 教程(匿名類)

xietao3 / 3194人閱讀

匿名類

匿名類可以使你代碼更簡(jiǎn)潔,它們使你能夠同時(shí)聲明和實(shí)例化一個(gè)類,它們就像局部類,除了它們沒有名稱,如果你只需要使用局部類一次,請(qǐng)使用它們。

聲明匿名類

雖然局部類是類聲明,但匿名類是表達(dá)式,這意味著你在另一個(gè)表達(dá)式中定義該類,以下示例HelloWorldAnonymousClasses在局部變量frenchGreetingspanishGreeting的初始化語句中使用匿名類,但使用局部類初始化變量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();
    }            
}
匿名類的語法

如前所述,匿名類是表達(dá)式,匿名類表達(dá)式的語法類似于構(gòu)造函數(shù)的調(diào)用,除了代碼塊中包含類定義。

考慮frenchGreeting對(duì)象的實(shí)例化:

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);
     }
};

匿名類表達(dá)式包含以下內(nèi)容:

new運(yùn)算符。

要實(shí)現(xiàn)的接口的名稱或要繼承的類,在此示例中,匿名類正在實(shí)現(xiàn)接口HelloWorld。

包含構(gòu)造函數(shù)參數(shù)的圓括號(hào),就像普通的類實(shí)例創(chuàng)建表達(dá)式一樣,注意:實(shí)現(xiàn)接口時(shí),沒有構(gòu)造函數(shù),因此你使用一對(duì)空括號(hào),如本例所示。

類聲明體,更具體地說,類體中,方法聲明是允許的,但語句不是。

因?yàn)槟涿惗x是表達(dá)式,所以它必須是語句的一部分,在此示例中,匿名類表達(dá)式是實(shí)例化frenchGreeting對(duì)象的語句的一部分(這解釋了為什么在閉合花括號(hào)后有一個(gè)分號(hào))。

訪問封閉范圍的局部變量,以及聲明和訪問匿名類的成員

與局部類一樣,匿名類可以捕獲變量,它們對(duì)封閉范圍的局部變量具有相同的訪問權(quán)限:

匿名類可以訪問其封閉類的成員。

匿名類無法訪問其封閉范圍中未聲明為final或者實(shí)際為final的局部變量。

與嵌套類一樣,匿名類中的類型(例如變量)的聲明會(huì)影響封閉范圍中具有相同名稱的任何其他聲明,有關(guān)更多信息,請(qǐng)參閱遮蔽。

匿名類對(duì)其成員也具有與局部類相同的限制:

你不能在匿名類中聲明靜態(tài)初始化或成員接口。

匿名類可以具有靜態(tài)成員,前提是它們是常量變量。

請(qǐng)注意,你可以在匿名類中聲明以下內(nèi)容:

字段

額外的方法(即使他們沒有實(shí)現(xiàn)超類型的任何方法)

實(shí)例初始化

局部類

但是,你不能在匿名類中聲明構(gòu)造函數(shù)。

匿名類的示例

匿名類通常用于圖形用戶界面(GUI)應(yīng)用程序。

考慮JavaFX示例HelloWorld.java(來自Hello World的部分,來自JavaFX入門的JavaFX樣式),此示例創(chuàng)建一個(gè)包含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指定當(dāng)你選擇Say "Hello World"按鈕時(shí)會(huì)發(fā)生什么,此方法需要EventHandler類型的對(duì)象,EventHandler接口只包含一個(gè)方法handle。該示例使用匿名類表達(dá)式,而不是使用新類實(shí)現(xiàn)此方法,請(qǐng)注意,此表達(dá)式是傳遞給btn.setOnAction方法的參數(shù)。

因?yàn)?b>EventHandler接口只包含一個(gè)方法,所以可以使用lambda表達(dá)式而不是匿名類表達(dá)式,有關(guān)更多信息,請(qǐng)參閱Lambda表達(dá)式一節(jié)。

匿名類是實(shí)現(xiàn)包含兩個(gè)或更多方法的接口的理想選擇,以下JavaFX示例來自UI控件的自定義部分,匿名類代碼創(chuàng)建一個(gè)只接受數(shù)值的文本字段,它通過重寫從TextInputControl類繼承的replaceTextreplaceSelection方法,使用匿名類重新定義TextField類的默認(rèn)實(shí)現(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() {
            @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);
    }
}
上一篇:局部類 下一篇:Lambda表達(dá)式

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72441.html

相關(guān)文章

  • Java? 教程(Lambda表達(dá)式)

    Lambda表達(dá)式 匿名類的一個(gè)問題是,如果匿名類的實(shí)現(xiàn)非常簡(jiǎn)單,例如只包含一個(gè)方法的接口,那么匿名類的語法可能看起來不實(shí)用且不清楚,在這些情況下,你通常會(huì)嘗試將功能作為參數(shù)傳遞給另一個(gè)方法,例如當(dāng)有人單擊按鈕時(shí)應(yīng)采取的操作,Lambda表達(dá)式使你可以執(zhí)行此操作,將功能視為方法參數(shù),或?qū)⒋a視為數(shù)據(jù)。 上一節(jié)匿名類向你展示了如何在不給它命名的情況下實(shí)現(xiàn)基類,雖然這通常比命名類更簡(jiǎn)潔,但對(duì)于只有一個(gè)...

    lansheng228 評(píng)論0 收藏0
  • Java? 教程(嵌套

    嵌套類 Java編程語言允許你在另一個(gè)類中定義類,這樣的類稱為嵌套類,如下所示: class OuterClass { ... class NestedClass { ... } } 術(shù)語:嵌套類分為兩類:靜態(tài)和非靜態(tài),聲明為static的嵌套類稱為靜態(tài)嵌套類,非靜態(tài)嵌套類稱為內(nèi)部類。 class OuterClass { ... stati...

    Cheng_Gang 評(píng)論0 收藏0
  • Java 8 簡(jiǎn)明教程

    摘要:簡(jiǎn)明教程原文譯者黃小非來源簡(jiǎn)明教程并沒有沒落,人們很快就會(huì)發(fā)現(xiàn)這一點(diǎn)歡迎閱讀我編寫的介紹。編譯器會(huì)自動(dòng)地選擇合適的構(gòu)造函數(shù)來匹配函數(shù)的簽名,并選擇正確的構(gòu)造函數(shù)形式。 Java 8 簡(jiǎn)明教程 原文:Java 8 Tutorial 譯者:ImportNew.com - 黃小非 來源:Java 8簡(jiǎn)明教程 ? Java并沒有沒落,人們很快就會(huì)發(fā)現(xiàn)這一點(diǎn) 歡迎閱讀我編寫的Java ...

    testHs 評(píng)論0 收藏0
  • Android內(nèi)存泄漏定位、分析、解決全方案

    摘要:如果這個(gè)靜態(tài)變量在生命周期結(jié)束后沒有清空,就導(dǎo)致內(nèi)存泄漏。因此造成內(nèi)存泄露。注冊(cè)沒取消造成的內(nèi)存泄露這種的內(nèi)存泄露比純的內(nèi)存泄漏還要嚴(yán)重,因?yàn)槠渌恍┏绦蚩赡芤孟到y(tǒng)的程序的對(duì)象比如注冊(cè)機(jī)制。 原文鏈接 更多教程 為什么會(huì)發(fā)生內(nèi)存泄漏 內(nèi)存空間使用完畢之后未回收, 會(huì)導(dǎo)致內(nèi)存泄漏。有人會(huì)問:Java不是有垃圾自動(dòng)回收機(jī)制么?不幸的是,在Java中仍存在很多容易導(dǎo)致內(nèi)存泄漏的邏輯(...

    yiliang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<