有人能解释一下Java中匿名类、嵌套类和私有类之间的区别吗?我想知道与每个相关的运行时成本以及每个编译器的方法,这样我就可以掌握哪个最适合用于例如性能(编译器优化的潜力)、内存使用以及其他 Java 编码人员的普遍可接受性。
我所说的匿名类是指那些以奇怪的 Java 方式在函数中声明为内联的类。这在 Swing 代码示例中经常出现,您可以在其中编写与其声明内联的按钮处理程序。我真的不喜欢匿名类,因为你会得到那些有趣的 MyClass$1.class 文件,而且当你发现你想让匿名类成为单例或需要它的句柄时,通常你必须重构,或者某物。我也不喜欢您在另一个函数调用过程中以刚刚编写的形式附加处理程序的方式。这让我感觉很奇怪。 :-)
私有类是您在文件底部完全在公共类声明之外编写的类。我更喜欢私有类,因为它们在其他语言中有意义,因为源文件和类之间没有很强的 1:1 关系。我没有那种奇怪的感觉,而且我知道(或者我认为我知道)Java 编译器将如何处理该类的声明。
嵌套类是写在公共类的波浪线内的类。我真的不知道嵌套类与其他两个类相比意味着什么。 :-)
有人能解释一下Java中匿名类、嵌套类和私有类之间的区别吗?
-
匿名类例如是 Runnable 类
new Thread(new Runnable() {
public void run() {
...
}
}.start();
-
嵌套类看起来像
class SomeClass {
...
class NestedClass {
....
}
}
私有类(您将其称为“完全在公共类声明之外的文件底部编写的类”)实际上是包作用域的类。你can't有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() {
}
}
被编译成:
$ 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
}
$ 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
}
$ 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
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)