1

我有三个问题。

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- 为什么内部类不能定义静态成员,除了静态最终字段?

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();如果允许静态方法,我们可以使用类似的东西。

4

1 回答 1

1

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

声明的anonymouse Runnable 类本质上bar()是函数本地的方法中的嵌套类bar()。因此,anonymouse 类可以访问父类的字段。但是如果变量i是函数的本地变量bar(),我们不想让任何其他函数访问它。对于方法中的内部类的功能bar(),我们可以允许读取它但不能改变它,否则它会看起来很奇怪,并且破坏了本地的道德规范

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. 类访问修饰符privatepublic也是如此protected

3-为什么内部类不能定义静态成员,除了静态最终字段?

内部类是非静态的。嵌套的静态类称为嵌套类,而不是内部类。它是在封闭实例的上下文中运行的。不知何故,允许静态变量和方法与这种动机相矛盾。但是,有关此问题的答案的更多详细信息:请参阅此处此处

于 2013-10-06T23:44:38.797 回答