簡體   English   中英

在匿名類中使用最終字段,在方法內聲明靜態嵌套類,並在內部類內定義靜態成員

[英]Using Final Fields in Anonymous Classes, Declaring Static Nested Class Inside a Method and Defining Static Members inside an Inner Class

我有三個問題。

1-如果非最終字段的值可以更改,那么如何在非匿名字段類中使用非最終字段?

class Foo{
    private int i;
    void bar(){
        i = 10
        Runnable runnable = new Runnable (){
            public void run (){
                System.out.println(i); //works fine
            }//end method run
        }//end Runnable
    }//end method bar
}//end class Foo 

2-為什么不能在方法內部聲明靜態嵌套類,因為內部類不能指定(本地類)的名稱?

Class Foo {
    void bar(){
        class LocalClass{ //static nested classes are NOT allowed here
            //define members
        }//end class LocalClass
    }//end method bar
}//end class Foo

3-為什么內部類不能定義除靜態final字段以外的靜態成員?

class Foo {
    class Bar{
        static int x; //NOTallowed
        static final int y; //allowed

        static void doSomething(){} //NOT allowed
    }//end class Bar
}//end class Foo

對於第三個問題,我知道內部類與外部類的實例相關聯,但這對我來說仍然沒有說服力。 我們可以使用諸如new Foo().Bar.doSomething(); 如果允許使用靜態方法。

1-如果非最終字段的值可以更改,那么如何在非匿名字段類中使用非最終字段?

class Foo{
    private int i;
    void bar(){
        i = 10;
        Runnable runnable = new Runnable (){
            public void run (){
                System.out.println(i); //works fine
            }//end method run
        }//end Runnable
    }//end method bar
}//end class Foo 

讓我們中斷代碼等效於-

class Foo{
        private int i;
ublic static void bar() {
    i = 10;
    Runnable r = new ARunnable();
    r.run();
}

private static class ARunnable implements Runnable {

    @Override public void run() {
        System.out.println(i);
    }
}
}

聲明的匿名Runnable類本質上是方法bar()的嵌套類,該方法是函數bar()局部類。 因此,匿名類可以訪問父類的字段。 但是,如果變量i是函數bar()局部變量,則我們不想允許任何其他函數訪問它。 對於方法bar()的內部類函數,我們可以允許對其進行讀取但不能對其進行更改,否則它看起來會很奇怪並破壞了local的倫理

class Foo{
   // private int i;
    void bar(){
        final int i = 10;  // adding `final` as i is local to function bar 
        Runnable runnable = new Runnable (){
            public void run (){
                System.out.println(i); 
            }//end method run
        }//end Runnable
    }//end method bar
}/  

2-為什么不能像內部類那樣在方法內部聲明靜態嵌套類?

正如Java規范所說:

緊接在塊中的局部類聲明的范圍(第14.2節)是緊緊包圍的塊的其余部分,包括它自己的類聲明。

如果我們在一個塊內聲明一個本地類,則它將在封閉的塊的上下文中運行。 沒有一個塊(方法)知道另一個塊(方法)的本地實例,因為在一個塊內聲明的任何內容對於該塊都是本地的。 因此,它所在的塊(方法)應該是唯一能夠實例化它的方法。 將其聲明為static毫無意義。 對於class access修飾符privatepublicprotected來說,情況也是如此。

3-為什么內部類不能定義除靜態final字段之外的靜態成員?

內部類是非靜態的。 嵌套的靜態類稱為嵌套類,而不是內部類。 它在封閉實例的上下文中運行。 不知何故,允許靜態變量和方法與這種動機相矛盾。 但是,有關此問題的答案的更多詳細說明,請參見此處此處

暫無
暫無

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

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