将嵌套类继承到子类中

时间:2013-07-17 18:02:38

标签: java inheritance nested-class

当我浏览this文章时,在超类中的私人会员部分下,我看到了这一行

  

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

我的问题是,我们如何才能直接访问Nested中的Base Derivedpublic(我们可以访问任何protectedDerived字段)?

如果有办法,p如何Base访问Nested 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' ? } } 到{{1}}的私有字段?

{{1}}

提前感谢您在此主题中花费的时间和精力!

3 个答案:

答案 0 :(得分:3)

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

或者对于Derived类,这应该有效:

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

我不确定您是否需要使用超级关键字

答案 1 :(得分:1)

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

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但不需要封闭实例的类,也可以使用静态嵌套类。

答案 2 :(得分:0)

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

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();
    }
}