簡體   English   中英

Java內部類具有靜態方法

[英]Java inner class with a static method

我知道這個問題很簡單,但是我真的想知道為什么我不去文檔中假設我有這樣的類。

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

}

兩種靜態方法均引發錯誤,指出

僅在常量變量聲明中允許使用修飾符“靜態”

我知道文檔指出

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).

但是我的問題是,diff是調用簡單值還是屬性而不是調用靜態方法,而不管是public還是private? 為什么可以調用屬性,但不能調用方法。

謝謝。

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

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

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

該不可見字段的類型為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代碼。 當從Outer的非靜態上下文中調用new Inner()this實例作為不可見參數傳遞給該構造函數,但是如果不存在,則代碼根本不會編譯...除非使用outer.new Inner()語法。

編譯器會阻止您向Inner添加靜態方法的原因是,這被認為會引起一些混亂。 基本上,您的問題的答案是:“沒有充分的理由..只是...規范說Java編譯器一定不允許它,因此javac不允許它”。

注意,實際上,這些非靜態內部類是令人困惑的事情。 我強烈建議您自學,除非您真的知道自己在做什么,否則一定要使內部類保持static 即使那樣,三思而后行。 然后再三思。 然后,也許考慮制作一個非靜態內部類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM