0

我有一个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  
        }
    };
}
4

4 回答 4

4

您有一个名为 的外部类Foo,它有一个名为 的私有字段buzz。在内部Foo,您正在创建一个匿名内部类,它是SelectionListener.

这个匿名内部Foo. 根据 java 规则,非静态内部类可以访问封闭类的所有字段(包括私有字段)。

这是JLS 指南中的说明。

于 2014-06-09T15:38:53.993 回答
2

内部和外部类之间的关系是它们可以访问所有成员,甚至是私有成员。因此,外部类可以访问内部类的所有成员,而内部类可以访问外部类。

你还需要知道在

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但属于声明GetOkListener方法的类(您可以将此类视为本地类,因为它是在方法内部声明的)。所以它可以访问外部类的成员并没有什么特别的。

于 2014-06-09T15:40:26.093 回答
1

那是因为

new SelectionListener() {...}

是一个匿名内部类。它是类的一部分Foo,因此它可以private访问Foo.

于 2014-06-09T15:39:09.260 回答
0

也许您可以访问原始的 Bazz 课程。这是一个内部类。

于 2014-06-09T15:38:53.593 回答