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

2022-09-01 10:52:26

这与其说是问题,不如说是一个谜题。我有以下代码:

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

    }

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

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

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

    }
}

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

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

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


答案 1

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

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


答案 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


推荐