字段被声明为私有,但我可以直接访问

时间:2014-06-09 15:32:38

标签: java oop inner-classes anonymous-inner-class

我有一个Foo课,它延伸Dialog(SWT) 我定义了一个数据成员private Bazz bazz

在这个类中,我定义了一个名为GetOkListener()的方法,它基本上返回一个SelectionListener对象。

方法public void widgetSelected(SelectionEvent arg0)中 我这样访问bazzFoo.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 个答案:

答案 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课程。这是一个内部阶级。