当前位置: 首页 > 知识库问答 >
问题:

在匿名类中使用Final字段,在方法中声明静态嵌套类,并在内部类中定义静态成员

邓德厚
2023-03-14

我有三个问题。

1-如果非final字段的值可以改变,如何在匿名类中使用?

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
class Foo {
    class Bar{
        static int x; //NOTallowed
        static final int y; //allowed

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

共有1个答案

羊舌庆
2023-03-14

1-如果非final字段的值可以改变,如何在匿名类中使用?

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可运行类本质上是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
}/  

如果我们在一个块内声明一个本地类,它将在封闭块的上下文中操作。任何块(方法)都不知道另一个块(方法)的本地实例,因为在块内声明的任何东西都是该块的本地实例。因此,它所在的块(方法)应该是唯一能够实例化它的块。将其声明为static没有任何意义。类访问修饰符privatepublicprotected也是如此。

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

内部类是非静态的。嵌套的静态类称为嵌套类,而不是内部类。它将在包含实例的上下文中进行操作。不知何故,允许静态变量和方法与这种动机相矛盾。然而,更多关于这个问题答案的详细说明:请参见这里和这里。

 类似资料:
  • 问题内容: 我想在中实现常量,因为在代码中找到常量是很有意义的。 到目前为止,我一直在使用静态方法实现以下变通方法: 我知道有可能摆弄原型,但许多人建议不要这样做。 有没有更好的方法在ES6类中实现常量? 问题答案: 您可以执行以下操作: 从 模块中 导出a 。根据您的用例,您可以: 并在必要时从模块导入该文件。或者,基于您的静态方法思想,您可以声明一个get访问器: 这样,您将不需要括号: 然后

  • 我为之编写的测试用例: 我还有最后一节课。 我已经在测试类中添加了以下代码: 但对我来说什么都不起作用。请建议在类中模仿方法的正确方法。

  • 我试图实现的是重写此方法: 公共布尔onKeyPreIme(int-keyCode,KeyEvent事件) 该方法位于SearchView中。搜索自动完成类http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.0_r1/android/support/v7/widget/Se

  • 问题内容: 为什么我们不能在非静态内部类中使用静态方法? 如果我将内部类设为静态,则可以工作。为什么? 问题答案: 因为内部类的实例与外部类的实例隐式关联,所以它本身不能定义任何静态方法。由于静态嵌套类无法直接引用其封闭类中定义的实例变量或方法,因此只能通过对象引用使用它们,因此在静态嵌套类中声明静态方法是安全的。

  • JVM为内部类成员和方法分配空间的方式有什么不同吗。请提供所有可用类型的嵌套类(静态、本地、非静态、匿名)在此上下文中的区别。我从其他各种渠道寻找,但没有弄清楚。

  • 我有以下代码: 到目前为止,代码还可以,但我无法在主方法中实例化'in',比如,因为它显示

  • 问题内容: 为什么我们不能在非静态内部类中使用静态方法? 如果我将内部类设为静态,则可以工作。为什么呢 问题答案: 因为内部类的实例与外部类的实例隐式关联,所以它本身不能定义任何静态方法。由于静态嵌套类无法直接引用其封闭类中定义的实例变量或方法,因此只能通过对象引用使用它们,因此在静态嵌套类中声明静态方法是安全的。

  • 问题内容: 我有以下代码: 到目前为止,代码还不错,但是我无法像显示的那样在main方法中实例化 我该怎么做?我不想使我的课堂静止。 问题答案: 你还必须参考其他外部类。 如果内在是静态的,那将是