公共嵌套类的子类无法访问封闭类的私有成员

时间:2016-06-12 15:33:38

标签: java

我读过here 一句话,如下所示

  

嵌套类可以访问其封闭类的所有私有成员 - 包括字段和方法。因此,子类继承的公共或受保护嵌套类可以间接访问超类的所有私有成员。

现在我有一个如下代码

class Locker {

private String secret = "This is my secret";

public class Util { }

}

class StealSecret extends Locker.Util { }

但我收到编译时错误如下

  

由于某些中间构造函数调用

,没有可用的Locker类型的实例

我无法理解导致编译时错误的确切原因。我在链接中看到的是错误的吗?

请给我一个例子来解释通过扩展内部类

来访问封闭类的私有成员的方法

2 个答案:

答案 0 :(得分:3)

其他答案已经解释了异常的原因,但尚未解决

  

请举例说明访问私人的方式   通过扩展内部类

来封闭类的成员

您的文件中的引用说明

  

嵌套类可以访问其封闭的所有私有成员   class-字段和方法。

嵌套类是在另一个中声明的类。 Locker.Util是一个嵌套类。 StealSecret不是(即使它已编译,请参见下面的诀窍)。

如果你真的需要扩展内部类并且可以访问private类的Locker成员,你需要声明Locker 中的子类

例如,

public class Locker {
    private String secret = "This is my secret";

    public class Util {
    }

    public class StealSecret extends Locker.Util {
        public StealSecret() {
            System.out.println(secret); // access
        }
    }
}

StealSecret类扩展了一个内部类,它需要引用该内部类的实例'附上课。您可以使用此技巧来提供该参考

class StealSecret extends Locker.Util {
    public StealSecret(Locker enclosing) {
        enclosing.super();
    }
}

答案 1 :(得分:0)

让我们从您正在分析的报价开始:

  

嵌套类可以访问其封闭类的所有私有成员 - 包括字段和方法。因此,子类继承的公共或受保护嵌套类可以间接访问超类的所有私有成员。

在上面的句子中,封闭类是您的Locker,嵌套类是Locker.Util,私有字段是secret。对于继承嵌套类的子类,这意味着您需要扩展封闭类,而不是嵌套类:

class StealSecret extends Locker {
    public StealSecret() {
        StealSecret.Util u = new StealSecret.Util();
        System.out.println(u.getSecret());
    }   
}

在这种情况下,继承的嵌套类实例可以间接访问私有的封闭类字段secret:

class Util { 
    String getSecret() { return secret; } 
}  

在这里,您可以看到继承的嵌套类将如何访问封闭类的私有字段:https://ideone.com/NK9Brs

你得到的编译错误:

  

由于某些中间构造函数调用

,没有可用的Locker类型的实例

是您错误的StealSecret尝试在Locker.Util类之外扩展Locker的错误的副产品,这是因为如果没有实例,非静态嵌套类就不会存在它的封闭类。