Java类:匿名vs嵌套vs私有

3 java jvm javac

有人可以解释Java中的匿名类,嵌套类和私有类之间的区别吗?我想知道与每个相关的运行时成本以及每个的编译器方法,因此我可以掌握哪个最好用于例如性能(编译器优化的可能性),内存使用以及与其他Java的一般可接受性编码器.

匿名类我指的是那些以奇怪的Java方式在函数中内联声明的类.这通常出现在Swing代码的示例中,您可以使用它的声明内联编写一个按钮处理程序.我真的不喜欢匿名类,因为你得到了那些有趣的MyClass $ 1.class文件,而且当你发现你想要让匿名类成为单例或需要它的句柄时,你将不得不重构.一些东西.我也不喜欢你在另一个函数调用的中间以你刚刚编写的东西的形式附加处理程序的方式.这让我觉得很奇怪.:-)

私有类是您在公共类声明之外完全写在文件底部的类.我更喜欢私有类,因为它们在源文件和类之间没有强大的1:1关系的其他语言中是有意义的.我没有那种奇怪的感觉,我知道(或者我想我知道)Java编译器将如何处理该类的声明.

嵌套类是在公共类的波形内写的.我真的不知道嵌套类与其他两个相比意味着什么.:-)

aio*_*obe 7

有人可以解释Java中的匿名类,嵌套类和私有类之间的区别吗?

  • 匿名类例如是Runnable

    new Thread(new Runnable() {
        public void run() {
            ...
        }
    }.start();
    
    Run Code Online (Sandbox Code Playgroud)
  • 嵌套类看起来像

    class SomeClass {
    
        ...
    
        class NestedClass {
            ....
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 私有类(您将其称为"您在文件底部完全在公共类声明之外编写的那些")实际上是包括作用域的类.你不能private在类前面有修饰符,除非它是嵌套的!

我想知道与每个相关的运行时成本以及每个的编译器方法,因此我可以掌握哪个最好用于例如性能(编译器优化的可能性),内存使用以及与其他Java的一般可接受性编码器.

我怀疑这些方法之间有任何性能差异.为什么?因为每种方法最终都被编译成一个或多或少的"常规"类.("或多或少",因为在某些情况下会生成访问方法,但它的副作用是免费的,并且最有可能由JIT内联.)

这段代码:

public class TestOuter {

    int fieldOuter;
    public void methodOuter() {
    }

    class TestInner {
        int fieldInner;
        public void methodInner() {
        }
    }
}


class TestPackage {

    int fieldPackage;
    public void methodPackage() {
    }

}
Run Code Online (Sandbox Code Playgroud)

获取编译成:

$ javap -c TestOuter$TestInner
Compiled from "TestOuter.java"
public class TestOuter extends java.lang.Object{
int fieldOuter;

public TestOuter();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public void methodOuter();
  Code:
   0:   return

}
Run Code Online (Sandbox Code Playgroud)
$ javap -c TestOuter
Compiled from "TestOuter.java"
public class TestOuter extends java.lang.Object{
int fieldOuter;

public TestOuter();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public void methodOuter();
  Code:
   0:   return

}
Run Code Online (Sandbox Code Playgroud)
$ javap -c TestPackage
Compiled from "TestOuter.java"
class TestPackage extends java.lang.Object{
int fieldPackage;

TestPackage();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public void methodPackage();
  Code:
   0:   return

}
Run Code Online (Sandbox Code Playgroud)

  • 同意,设计更多地与代码布局和局部变量/实例变量可见性有关. (2认同)