我没有看过它的内部结构,但让我们首先假设编译器添加了一个对象以在编译时进行新的操作。这意味着我们所有的类都是另一个类的内部类。由于它们没有在另一个类中声明,因此情况并非如此。所以:不,它不会在编译时添加这样的东西。
实际上,让我们分解一下。
public class Outer {
String strHello = "Hello ^^";
public void printHello() {
System.out.println(strHello);
}
public static void main(String[] args) {
// This will print: Hello ^^
Outer outer = new Outer();
outer.printHello();
// This will print: Hello ^^
new Outer().printHello();
}
}
我猜你以前见过这样的代码。它只是调用实例化类的方法。点符号也可用于访问变量和内部类。在上面我们已经将它用于实例方法。使用关键字static
允许类的所有实例甚至单独的类共享方法和变量。
public class Outer {
static String strHello = "Hello ^^";
public static void printHello() {
System.out.println(strHello);
}
static class StaticInner {
}
static class Inner {
}
public static void main(String[] args) {
// Prints: Hello ^^
Outer.printHello();
// Constructs a new Example.StaticInner
Outer.StaticInner inner = new Outer.StaticInner();
// Constructs a new Outer.Inner
Outer.Inner inner = new Example().new Inner();
// Constructs a new Outer.Inner
Example ex = new Example();
Outer.Inner inner = ex.new Inner();
}
}
上面的代码使用了一个静态内部类,希望能证明一个内部构造函数就像任何其他构造函数一样。但是,因为它在另一个类中,我们需要通过另一个(外部)类来访问它。它不是静态内部类,由于访问修饰符,我们需要使用实例来访问它。