内部类可见性的一些麻烦

时间:2019-04-25 09:08:23

标签: java subclass inner-classes

我正在面对Java内部类,并且在外部变量可见性方面遇到了一些麻烦。

class A {
    private int x = 5;
    class B extends A{
        public void fun(B b){
            b.x = 10; //here
        }
    }
}

如果内部类和外部类之间没有可见性限制,为什么我不能做这样的事情(请参见“ here”标签)?我真的不理解这些规则。

4 个答案:

答案 0 :(得分:2)

在您的示例中,成员变量x不是类B的属性,因此b.x = 10不会产生任何错误,因此该错误与可见性规则无关。尝试使用x = 10效果很好,这是A.this.x = 10super.x = 10的捷径。

答案 1 :(得分:1)

修饰符private不能在子类中访问。

class A {
    private int x = 5; // The issue is in `private` in this line
    class B extends A{
        public void fun(B b){
            b.x = 10; //here
        }
    }
}

如果删除修饰符private并将其更改为defaultpublicprotected,则可以访问该变量。

请通过link进行更好的理解。

更新:

删除扩展关键字(现在,类B将不再是子类,而只是内部类),并且变量x将仅使用 this super 关键字。在link

中详细说明了用法

答案 2 :(得分:0)

您需要了解这三个privateprotecteddefaultpublic访问说明符

  1. private变量只能在本身的类中修改,不包括subclass
  2. default变量可以在同一程序包中进行修改。
  3. protected变量可以在子类中以及在同一包及其自身中修改
  4. public变量可以在任何地方进行修改。
  

您可以在此link

上看到它

在旁边。如果使用此示例,则可以使用super说明符来修改变量,以访问可见的对象

class A {
    private int x = 5;
    class B extends A{
        public void fun(B b){
            b.x = 10; //here error
            super.x=1;//this is ok
        }
    }
}

这个b.x = 10; //here error的问题是b是方法的参数,不是成员变量或超类变量。

答案 3 :(得分:0)

这很特别。内部类可以访问外部类的私有字段。这可以通过fun(A)方法显示

class A {
    private int x = 5;
    class B extends A{

        public void fun(A a){
            a.x = 5; //Valid since we are in the same class (inner-class can access private field)
        }
}

现在,如果您有一个B参数,则有点不同,因为它将尝试使用继承而不是外部-内部链接:

public void fun(B b){
    b.x = 10; //Access using inheritence, not OK for private field
    ((A)b).x = 10; //Casting into A to be able to access the private field (just like fun(A).
}

请注意,这是一个问题,因为您更新了参数中的引用接收,因此可以轻松地更新当前内部实例

public void fun(){
    x = 10; //OK : access to A.x from inner class
    super.x = 10; //OK : same

    this.x = 10; // KO : trying to access a private variable from B scope
}