嵌套类中私有构造函数的作用域

33

这更像是一个谜题而不是问题。我有以下代码:

public class PrivateBaseConstructor {
    public static class BaseClass {
        private BaseClass() {
        }

    }

    public static class DerivedClass extends BaseClass {
        public DerivedClass() {
            super(); // 1*
        }
    }
}

即使基类构造函数是 private,在 1*处调用 super(); 是允许的。如果我们将类写成同一包中的单独类:

BClass.java
public class BClass {
    private BClass() {

    }
}

DClass.java
public class DClass extends BClass {
    public DClass() {
        super(); // 2*
    }

由于基类构造函数不可见,因此编译器在2*处正确地给出了错误。

为什么在我的第一个场景中,当两个类在同一类中声明为静态时,编译器没有抛出错误?

3个回答

37

4
因为嵌套类可以访问彼此的成员,这与静态声明无关。请参见以下示例代码,仅使用嵌套内部类(非静态)。
public class PrivateBaseConstructor {
    public class BaseClass {
        private BaseClass() {}
    }

    public class DerivedClass extends BaseClass {
        public DerivedClass() {
            super(); // 1*
        }
    }

    public static void main(String[] args)
    {
       new PrivateBaseConstructor(). new DerivedClass();
    }
}

在这里阅读有关嵌套类的更多信息:http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html


1

因为在类内部声明的任何内容都可以访问其私有成员,包括内部类。但是,如果您在类上运行PMD,您会发现它建议您将构造函数的可见性更改为非私有。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接