【问题标题】:Field is declared as private but I'm able to access directly字段被声明为私有但我可以直接访问
【发布时间】:2014-06-09 15:32:37
【问题描述】:

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

【问题讨论】:

  • 你能粘贴代码而不是“代码描述”吗?
  • 感觉这里涉及到了内部类。
  • 内部类可以访问外部类私有成员

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


【解决方案1】:

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

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

JLS guidelines 声明相同。

【讨论】:

    【解决方案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  
        }
    };
    

    您正在创建anonymous-inner-class,它扩展/实现了SelectionListener,但属于声明GetOkListener 方法的类(您可以考虑这个类local,因为它是在方法内部声明的)。所以它可以访问外部类的成员并没有什么特别的。

    【讨论】:

      【解决方案3】:

      那是因为

      new SelectionListener() {...}
      

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2013-03-31
          • 2017-10-02
          • 1970-01-01
          • 2013-10-09
          • 1970-01-01
          • 2015-02-10
          • 2023-03-14
          • 2013-06-15
          • 2023-03-08
          相关资源
          最近更新 更多