我读过here 一句话,如下所示
嵌套类可以访问其封闭类的所有私有成员 - 包括字段和方法。因此,子类继承的公共或受保护嵌套类可以间接访问超类的所有私有成员。
现在我有一个如下代码
class Locker {
private String secret = "This is my secret";
public class Util { }
}
class StealSecret extends Locker.Util { }
但我收到编译时错误如下
由于某些中间构造函数调用
,没有可用的Locker类型的实例
我无法理解导致编译时错误的确切原因。我在链接中看到的是错误的吗?
请给我一个例子来解释通过扩展内部类
来访问封闭类的私有成员的方法答案 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
的错误的副产品,这是因为如果没有实例,非静态嵌套类就不会存在它的封闭类。