【问题标题】:Visibility of inner class variables内部类变量的可见性
【发布时间】:2015-11-24 04:39:56
【问题描述】:

我有一个代码-

public class Hello
{
    void create()
    {
        Inner obj=new Inner();
        obj.r=100; //Able to access private variable x
        obj.display(); //displays 100
    }
    class Inner
    {
        private int r=45;
        void display()
        {
            System.out.println("r is : "+r);
        }
    }
    public static void main(String[] args)
    {
        Hello ob=new Hello();
        ob.create();
    }
}

在上面的代码中,通过创建内部类的实例,我们可以访问该类中定义的私有变量。但是继承的情况下不是这样。为什么会这样?例如,在这个代码-

class One
{
    private int x;
    void getData()
    {
        x=10;
    }
    void display()
    {
        System.out.println("x is : "+x);
    }
}
class Two extends One
{
    int y;
    void putData()
    {
        One o=new One();
        o.x=13; //Error
    }
}
public class File
{
    public static void main(String[] args)
    {
        Two to=new Two();
        to.putData();
    }
}

这背后的确切原因是什么?提前谢谢...

【问题讨论】:

  • 很难想象一个答案,因为这就是 Java 的实现方式。
  • 使用protected有什么问题?应该在这两种情况下都有效。
  • @Mephy-我不认为我的问题和你提到的问题完全一样。
  • 类的所有成员都可以访问该类的其他成员,甚至是私有成员。因此,在这种情况下,您只需将 Inner 类型视为外部类的 member(虽然从技术上讲它不是成员,但您明白了)。

标签: java object inheritance outer-join


【解决方案1】:

请参阅Java Language Specification

否则,如果成员或构造函数声明为private,则当且仅当它出现在包含成员或构造函数。

意味着顶级类可以访问其嵌套类的私有成员。

或者换一种说法:私有意味着顶层类及其所有嵌套类私有,而不是嵌套类本身私有。

【讨论】:

    猜你喜欢
    • 2015-10-20
    • 2014-09-20
    • 2020-08-29
    • 2016-03-31
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 2023-03-11
    • 2011-07-30
    相关资源
    最近更新 更多