将嵌套类inheritance到子类中

当我阅读这篇文章时,在超类的私人成员部分,我看到了这一行

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

我的问题是我们如何直接访问DerivedNestedBase (就像我们可以访问任何public protected字段一样)?

如果有办法, Derived如何通过Nested访问哪个是Base私有字段?

 public class Base { protected int f; private int p; public class Nested { public int getP() { return p; } } } class Derived extends Base { public void newMethod() { System.out.println(f); // i understand inheriting protected field // how to access the inherited Nested class here? and if accessed how to retrieve 'p' ? } } 

在此post中提前感谢您的时间和精力!

 Base.Nested theClassBro= new Base.Nested(); 

或者对于Derived类,这应该工作:

 Derived.Nested theClassBro= new Derived.Nested(); 

我不确定你是否需要使用super关键字

非静态内部类总是需要它嵌套的类的封闭实例。在类Base或类Derived中定义的代码中(因为它inheritance了内部类),你可以简单地写

 Nested nested = new Nested(); 

创建新实例。 然后,您可以在嵌套引用上调用getP()方法以获取私有p值的值。 此值是包含嵌套实例的类Base实例的一部分。

因为内部类是公共的,所以在Base或Derived之外定义的代码也可以创建实例。 但这需要一个包含Derived或Base的实例。 Java具有特殊语法,您可以在封闭类的实例上调用new运算符。 所以在Base或Derived之外你可以做到:

 Base base = new Base(); Base.Nested baseNested = base.new Nested(); Derived derived = new Derived(); Derived.Nested derivedNested = derived.new Nested(); Base.Nested d = derivedNested; 

也可以导入Base.Nested,以便您可以编写:

 Base base = new Base(); Nested baseNested = base.new Nested(); Derived derived = new Derived(); Nested derivedNested = derived.new Nested(); // Base.Nested reference 

知道这种语法很好,但是如果只允许封闭类创建内部类的新实例,我觉得代码通常更清晰(更容易理解,更好的封装)。 如果需要一个逻辑上只属于Base但不需要封闭实例的类,也可以使用静态嵌套类。

您可能知道,只有在包含Nested类定义的类的封闭实例时才能创建Nested ,在我们的示例中,它是Enclosing类。 为了能够通过inheritance其Nested类来访问Enclosing类的私有成员,我们需要向Derived类的构造函数提供包含Enclosing.Nested的封闭实例。 以下代码应该更清楚地理解。 为了更好地理解,我更改了原始示例中的变量和类的名称:


 public class Enclosing { protected int protectedMember = 3; private int privateMember = 7; public class Nested { public int getPrivate() { return privateMember; } public int getProtected() { return protectedMember; } } } 

 class Derived extends Enclosing.Nested { //Provide the enclosing instance that contains Enclosing.Nested public Derived() { new Enclosing().super(); } //Access protected member of Enclosing class public void accessProtectedMember() { System.out.println(getProtected()); } //Access private Member of Enclosing class public void accessPrivateMember() { System.out.println(getPrivate()); } } 

 public class Test { public static void main(String... args) { Derived derived = new Derived(); derived.accessProtectedMember(); derived.accessPrivateMember(); } }