2011-06-05 85 views
0

我有一个关于成员内部类的顶级类的可访问性的查询。 我刚刚读到了为什么本地或匿名内部类只能访问最终变量的原因。原因是JVM将这两个类作为完全不同的类来处理,因此,如果一个类中的变量值发生更改,它不能反映在在另一个类文件中运行时间。然后,我的问题是,内部成员类(非静态)如何能够访问顶级类成员的成员,因为JVM仍然将这两个类视为不同的类文件?如果顶级类的成员变量的值发生变化,在运行时如何反映在内部类的类文件中?内部类中顶级类成员的可访问性?

回答

5

它们是单独的类,但在“内部”类中存在对“外部”类的实例的隐式引用。它基本上作为一个变量,你可以通过隐式或通过ContainingClassname.this的特殊语法来获得。

请注意,如果你希望这样的隐式引用,你应该把嵌套类声明为static

public class Outer 
{ 
    private class Inner 
    { 
     // There's an implicit reference to an instance of Outer in here. 
     // For example: 
     // Outer outer = Outer.this; 
    } 

    private static class Nested 
    { 
     // There's no implicit reference to an instance of Outer here. 
    } 
} 
+0

但是,对于本地类(方法级),为什么他们不能拥有顶级类的这种隐式引用来直接使用它的成员而不是将它们声明为最终的? – 2011-06-05 17:19:00

+0

@Sumit:因为内部类没有变量本身的副本 - 只是对外部类实例的引用。它只是* local *变量,最后在匿名内部类中创建副本。你可以从封闭的实例中访问* instance *变量而不需要它们是最终的,即使在匿名内部类中也是如此。 – 2011-06-05 17:21:04

+0

ohh ...是...现在得到它...... – 2011-06-05 17:38:06

1

this隐含最后,你不能改变它。当你写像

class Outer { 
    int a; 
    class Inner { 
     { a = 1; } 
    } 
} 

一些事情,你实际上是写一样

class Outer { 
    int a; 
    class Inner { 
     { Outer.this.a = 1; } 
    } 
} 

a是不是最终的,但Outer.this是,那是用来参考。