我有几个与 Java 中的嵌套类有关的问题。
关于内存分配,嵌套类如何“隐藏”?
您不能在嵌套类中声明静态变量(我认为确切的错误是静态属性只能在顶级类中声明)。为什么这是嵌套类以及有哪些其他限制?
如果可能,请说明您的答案是否特定于 Java,或者 C++ 是否也遵循相同的规则?
我有几个与 Java 中的嵌套类有关的问题。
关于内存分配,嵌套类如何“隐藏”?
您不能在嵌套类中声明静态变量(我认为确切的错误是静态属性只能在顶级类中声明)。为什么这是嵌套类以及有哪些其他限制?
如果可能,请说明您的答案是否特定于 Java,或者 C++ 是否也遵循相同的规则?
就内存和编译而言,内部类与常规类完全相同。(也许它们在内存中的管理方式有所不同,但对于普通的 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
,则需要创建外部类的实例才能初始化该字段,并且静态成员不能绑定到特定实例。
我也发现了这个讨论。
基本上,嵌套类只是一个具有引用封闭实例的字段的类。
除非它是一个静态嵌套类(您可以在其中声明静态字段/方法)。在这种情况下,它只是一个名称中包含另一个路径元素的类(包 + 封闭类名称)。
换句话说。非静态嵌套类(内部类) - 没有封闭实例就不能存在(例如书内的页面)。你实例化如下:
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
嵌套类只是在另一个类中定义一个类型。Java 不关心新类型在什么范围内定义,您不需要以任何特殊方式“处理”这个内部类。
拥有一个带有静态字段的非静态内部类是没有意义的,因为对非静态内部类的任何引用都必然是一个实例变量。只有当内部类被创建static
时,才可能静态分配它——在这种情况下,静态内部类是一个独立的类,封闭的类名充当另一个命名空间级别。