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

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

帶有靜態方法的 Java 內部類

帶有靜態方法的 Java 內部類

拉風的咖菲貓 2023-02-16 17:02:06
我知道這個問題有點簡單,但我真的想知道為什么而不是去文檔假設我有這樣的課程。public class OuterClass{public static void main(String[] args)throws Exception{    System.out.println(OuterClass.InnerClass.yearOfBorn);//works ok    System.out.println(OuterClass.InnerClass.returnYearOfBorn());//not works    System.out.println(OuterClass.InnerClass.returnYearOfBornAsPublic());//not works}    private final class InnerClass{    private static final int yearOfBorn=13;    private static int returnYearOfBorn(){        return yearOfBorn;    }            public static int returnYearOfBornAsPublic(){        return yearOfBorn;    }            }}兩種靜態方法都拋出錯誤說明修飾符 'static' 只允許在常量變量聲明中使用我知道文檔指出這在 Java 語言規范部分§8.1.3 中有描述8.1.3 內部類和封閉實例An inner class is a nested class that is not explicitly or implicitly declared static. Inner classes may not declare static initializers (§8.7) or member interfaces. Inner classes may not declare static members, unless they are compile-time constant fields (§15.28).但我的問題是調用簡單值或屬性與調用靜態方法的區別是什么,無論是公共的還是私有的?為什么可以調用屬性而不是方法。
查看完整描述

1 回答

?
尚方寶劍之說

TA貢獻1788條經驗 獲得超4個贊

非靜態內部類有一些特別之處。


靜態內部類沒有。頂級課程沒有它。任何內部接口或枚舉都沒有。


那個特殊的東西是一個看不見的領域。


這個不可見的字段是類型Outer,它是final。它在其構造函數中被初始化為第一件事,并且,是的,非靜態內部類的每個構造函數都有一個神奇的不可見參數,類型為 ,用作Outer此字段。


所以,當你寫:


public class Outer {

    public class Inner {

    }

}

編譯器將像您實際編寫的那樣編譯此代碼:


public class Outer {

    public static class Inner {

        private final Outer I_AM_MAGIC;


        public Inner(Outer outer) {

            this.I_AM_MAGIC = outer;

        }

    }

}

你可以使用javap反編譯工具看到這個隱藏的魔法;通過-verbose,-private你會看到這些。這種魔法存在的原因是您可以從內部調用外部的實例方法,但是..您在什么實例上調用這些外部方法?在那個隱藏的實例上!


請注意,這段奇異的、看似怪異的代碼:someOuter.new Inner()實際上是合法的 Java 代碼。當new Inner()從 中的非靜態上下文中調用時Outer,this實例作為不可見參數傳遞給該構造函數,但如果您不在那里,代碼根本不會編譯......除非您使用語法outer.new Inner()。


編譯器會阻止您添加靜態方法的原因是Inner它被認為會導致一些混亂?;旧?,你的問題的答案是:“沒有充分的理由......只是......規范說java編譯器不能允許它,因此,javac不允許它”。


請注意,實際上這些非靜態內部類是令人困惑的東西。我強烈建議你教自己總是做你的內部課程static,除非你真的知道你在做什么。即使那樣,也要三思。然后再三思。然后也許考慮制作一個非靜態內部類。


查看完整回答
反對 回復 2023-02-16
  • 1 回答
  • 0 關注
  • 112 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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