嵌套类中私有构造函数的范围

时间:2012-09-22 08:35:15

标签: java inheritance constructor superclass

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

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

    }

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

虽然基类构造函数是super();,但在此处调用private为1 *是允许的事件。如果我们将类作为单独的类写在同一个包中:

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

    }
}

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

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

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

3 个答案:

答案 0 :(得分:29)

如果成员或构造函数被声明为private,则当且仅当它发生在包含成员或构造函数声明的顶级类(第7.6节)的主体内时才允许访问。

http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6.1

答案 1 :(得分: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

答案 2 :(得分:1)

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