5

我有几个与 Java 中的嵌套类有关的问题。

  • 关于内存分配,嵌套类如何“隐藏”?

  • 您不能在嵌套类中声明静态变量(我认为确切的错误是静态属性只能在顶级类中声明)。为什么这是嵌套类以及有哪些其他限制?

如果可能,请说明您的答案是否特定于 Java,或者 C++ 是否也遵循相同的规则?

4

3 回答 3

2

就内存和编译而言,内部类与常规类完全相同。(也许它们在内存中的管理方式有所不同,但对于普通的 Java 开发人员来说是不可见的)事实上,当您编译具有内部类的类时,您可以看到编译后的 .class 文件为OuterClass$InnerClass.class. 据我所知,JVM 对它们一视同仁。

就静态变量而言,我不确定问题是什么。例如,这为我运行:

public class Tester {
  public static void main(String[] args) {
    System.out.println(InnerTester.MY_STRING);
  }

  public class InnerTester {
    public static final String MY_STRING = "MY_STRING";
  }
}

编辑

正如杰弗里指出的那样,这不会编译:

public class Tester {
  public static void main(String[] args) {
    System.out.println(InnerTester.MY_STRING);
  }

  public class InnerTester {
    public static String MY_STRING = "MY_STRING";
  }
}

不同之处在于,我将第一个静态变量列为 final。

在考虑了一会儿之后,我同意@Eugene。它们允许内部类上的静态字段,final因为这样就没有初始化问题。该值不能更改,您只需将其初始化为它的值。但是,如果静态字段不是 final,则需要创建外部类的实例才能初始化该字段,并且静态成员不能绑定到特定实例。

我也发现了这个讨论。

于 2012-04-07T02:48:06.197 回答
1

基本上,嵌套类只是一个具有引用封闭实例的字段的类。

除非它是一个静态嵌套类(您可以在其中声明静态字段/方法)。在这种情况下,它只是一个名称中包含另一个路径元素的类(包 + 封闭类名称)。

换句话说。非静态嵌套类(内部类) - 没有封闭实例就不能存在(例如书内的页面)。你实例化如下:

 Book book = ... // a book instance;
 Book.Page page = book.new Page(); // requires an enclosing instance

但是静态嵌套类 - 是完全独立的,它就像一个命名空间的问题。您可以将其实例化为:

 Outer.NestedStatic instance = new Outer.NestedStatic(); // just name-space

更多信息在这里:http ://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

于 2012-04-07T02:46:40.020 回答
0

嵌套类只是在另一个类中定义一个类型。Java 不关心新类型在什么范围内定义,您不需要以任何特殊方式“处理”这个内部类。

拥有一个带有静态字段的非静态内部类是没有意义的,因为对非静态内部类的任何引用都必然是一个实例变量。只有当内部类被创建static时,才可能静态分配它——在这种情况下,静态内部类是一个独立的类,封闭的类名充当另一个命名空间级别。

于 2012-04-07T02:48:56.903 回答