繁体   English   中英

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

[英]Subclass of a public nested class is unable to access private members of enclosing class

在这里读了一个句子如下

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

现在我有如下代码

class Locker {

private String secret = "This is my secret";

public class Util { }

}

class StealSecret extends Locker.Util { }

但是我收到如下的编译时错误

由于某些中间构造函数调用,因此没有Locker类型的封闭实例

我无法理解到底是什么导致了编译时错误。 我在链接中阅读的内容是否错误?

请给我一个例子,解释通过扩展内部类来访问封闭类的私有成员的方法

其他答案已经解释了导致异常的原因,但没有解决

请给我一个例子,解释通过扩展内部类来访问封闭类的私有成员的方法

您文件中的引述内容

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

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

如果您确实需要扩展该内部类有权访问Locker类的private成员,则还需要在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();
    }
}

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

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

在上面的句子中,封闭的类是您的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 Locker.Util之外的错误的StealSecret ,这是因为没有其封闭类的实例就不能存在非静态嵌套类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM