-->

在嵌套类私有构造的范围(scope of private constructor in Nested

2019-07-31 19:27发布

这更是一个比问题。 我有以下代码:

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

    }

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

这里呼吁super(); 在1 *允许情况下,虽然基类的构造函数是private 。 如果我们写的类在同一个包单独的类:

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

    }
}

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

编译器在2 *示意这是错误,因为基类构造函数是不可见的。

为什么不编译器抛出一个错误,在我的第一个方案,当两个类的一个类中声明为static?

Answer 1:

如果成员或构造被声明的私人,则访问被许可,如果且仅当包围的成员或构造的声明的顶层类(第7.6节)的主体内发生的。

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



Answer 2:

因为嵌套类可以看到对方的成员。 这有什么好做静态声明。 见你的代码只用嵌套内部类(而不是静态)下面的例子。

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



Answer 3:

因为一个类中声明的任何东西都可以访问它的私有成员,包括内部类。 但是,如果你运行PMD在你的类,你会发现它建议您更改构造不和私营部门的知名度。



文章来源: scope of private constructor in Nested Class