亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

是否可以向匿名類添加屬性而不是僅覆蓋其方法?

是否可以向匿名類添加屬性而不是僅覆蓋其方法?

手掌心 2023-07-28 15:14:25
我想知道是否可以在 JAVA 中向匿名類添加屬性?,maby 是一個簡單的問題,但這里的技巧是我在 google 上看到一些代碼正在這樣做,但當我在 Netbeans 中嘗試時,它沒有發生。我以匿名方式創建了該類的一個實例,但我沒有覆蓋該方法,而是添加了其他方法和一個變量,并且該實例很簡單,在谷歌中,其他人動態地創建了該類,我不明白為什么? public class Cat(){  public void sayMew(){} } Cat gato = new Cat{  @Override  public void sayMew(){System.out.println("mew");  };    gato.sayMew(); //This works fine. //Some code over there do this and it didn't work for me: Cat gato = new Cat(){  int legs = 4;  public void scratch(){System.out.println("scratch");  };   //Even I saw this king of instances be pointed by variables types :/ what am I doing wrong?
查看完整描述

3 回答

?
呼喚遠方

TA貢獻1856條經驗 獲得超11個贊

您可以在 Java 中的匿名類中定義新方法或字段,但是當您將該匿名類定義分配給父類類型時,您將無法調用匿名類中定義的新方法或通過父類參考。


當你做這樣的事情時:


Cat gato = new Cat() {

    int legs = 4;

    public void scratch() {

         System.out.println("scratch");

    }

}

您實際上是Cat用匿名類擴展該類,然后在該匿名子類中定義新方法?,F在,當您將子類實例分配給父類引用時,無法通過父類引用調用新方法,因為父類不知道它們。


要調用它,您需要立即調用它:


new Cat() {

    int legs = 4;

    public void scratch() {

         System.out.println("scratch");

    }

}.scratch();

因此,您可以在匿名子類中定義新方法或字段,但不能通過父引用調用它們,要么在內部使用它們,要么直接調用它們(如我演示的那樣)。


通常,匿名類會重寫父類方法或內聯實現接口。Java 8之前的函數式接口可以通過匿名類來實現,Java 8之后主要通過lambda表達式來實現。


查看完整回答
反對 回復 2023-07-28
?
米琪卡哇伊

TA貢獻1998條經驗 獲得超6個贊

更多的是附錄,因為其他答案并不是 100% 完整:

您可以在 Java 中的匿名類中定義新方法或字段,但是當您將該匿名類定義分配給父類類型時,您將無法調用匿名類中定義的新方法或通過父類參考。

這是正確的,但從 Java 10 開始,我們有了關鍵字var

var?cat?=?new?Cat()?{?int?legs?=?4;?...

現在編譯器知道:您不僅創建了該匿名內部類,而且現在編譯器知道這是該內部cat類的實例。在此之前,您只能使用引用來表示內部類的實例。現在您可以使用知道這比普通貓“更多”的東西。因此,使用 java 10,您現在可以在該內部類之外執行操作!現在有一種方法來表示內部類實例,以跟蹤其真實性質!CatvarSystem.out.println(cat.legs)

這實際上在現實世界中很有價值,例如:

Henri Tremblay 很好地使用了這個技巧,使用匿名內部類來模擬 Java 中元組的概念。


查看完整回答
反對 回復 2023-07-28
?
素胚勾勒不出你

TA貢獻1827條經驗 獲得超9個贊

首先,您的代碼未編譯。要聲明類,不應使用括號。


假設你的具體類Cat是這樣的。


class Cat {

    void meow() {

        System.out.println("I'm a cat!");

    };

}

你可以像這樣實例化匿名類


Cat cat = new Cat() {

    int lives = 9;


    @Override

    void meow() {

        super.meow();

        System.out.printf("And I have %s lives!", lives);

    }

};


cat.meow();

//prints:   

//I'm a cat!

//And I have 9 lives!


查看完整回答
反對 回復 2023-07-28
  • 3 回答
  • 0 關注
  • 208 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號