国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java? 教程(匿名類)

xietao3 / 3160人閱讀

匿名類

匿名類可以使你代碼更簡潔,它們使你能夠同時聲明和實例化一個類,它們就像局部類,除了它們沒有名稱,如果你只需要使用局部類一次,請使用它們。

聲明匿名類

雖然局部類是類聲明,但匿名類是表達式,這意味著你在另一個表達式中定義該類,以下示例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();
    }            
}
匿名類的語法

如前所述,匿名類是表達式,匿名類表達式的語法類似于構(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接口只包含一個方法handle。該示例使用匿名類表達式,而不是使用新類實現(xiàn)此方法,請注意,此表達式是傳遞給btn.setOnAction方法的參數(shù)。

因為EventHandler接口只包含一個方法,所以可以使用lambda表達式而不是匿名類表達式,有關(guān)更多信息,請參閱Lambda表達式一節(jié)。

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

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

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/72441.html

相關(guān)文章

  • Java? 教程(Lambda表達式)

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

    lansheng228 評論0 收藏0
  • Java? 教程(嵌套

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

    Cheng_Gang 評論0 收藏0
  • Java 8 簡明教程

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

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

    摘要:如果這個靜態(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)存泄漏的邏輯(...

    yiliang 評論0 收藏0

發(fā)表評論

0條評論

xietao3

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<