我有一个Foo
课,它延伸Dialog
(SWT)
我定义了一个数据成员private Bazz bazz
在这个类中,我定义了一个名为GetOkListener()
的方法,它基本上返回一个SelectionListener
对象。
方法public void widgetSelected(SelectionEvent arg0)
中
我这样访问bazz
:Foo.this.bazz
。
我的问题是,
这怎么可能? bazz
定义为private
。
此课程在Foo extends Dialog
@Override
protected SelectionListener GetOkListener() {
return new SelectionListener() {
public void widgetSelected(SelectionEvent arg0) {
System.out.println(CreateAlbumDialog.this.album);
}
public void widgetDefaultSelected(SelectionEvent arg0) {
// TODO Auto-generated method stub
}
};
}
答案 0 :(得分:4)
您有一个名为Foo
的外部类,它有一个名为buzz
的私有字段。在Foo
内,您正在创建匿名内部类,这是SelectionListener
的实现。
此 匿名内部类 是非静态内部类(默认情况下)Foo
。根据java规则,非静态内部类可以访问封闭类的所有字段(包括私有字段)。
这是JLS guidelines同样的说法。
答案 1 :(得分:2)
内部和外部阶级之间的关系是他们可以访问所有他们的成员甚至是私人成员。所以Outer类可以访问Inner的所有成员,而Inner可以访问Outer类。
您还需要知道
return new SelectionListener() {
public void widgetSelected(SelectionEvent arg0) {
System.out.println(CreateAlbumDialog.this.album);
}
public void widgetDefaultSelected(SelectionEvent arg0) {
// TODO Auto-generated method stub
}
};
您正在创建扩展/实现SelectionListener
的{{3}}但属于声明GetOkListener
方法的类(您可以考虑此类anonymous-inner-class,因为它是在方法内声明的) 。因此,它可以访问外部类的成员,这没什么特别的。
答案 2 :(得分:1)
那是因为
new SelectionListener() {...}
是 Anonymous Inner Class 。它是课程Foo
的一部分,因此可以访问private
中的Foo
个字段。
答案 3 :(得分:0)
也许您可以访问原始的Bazz课程。这是一个内部阶级。