将嵌套类inheritance到子类中
当我阅读这篇文章时,在超类的私人成员部分,我看到了这一行
嵌套类可以访问其封闭类的所有私有成员 – 包括字段和方法。 因此,子类inheritance的公共或受保护嵌套类可以间接访问超类的所有私有成员。
我的问题是我们如何直接访问Derived
的Nested
类Base
(就像我们可以访问任何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(); } }