【问题标题】:scope of private constructor in Nested Class嵌套类中私有构造函数的范围
【发布时间】:2012-09-14 13:33:12
【问题描述】:

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

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* 处给出错误,因为基类构造函数不可见。

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

【问题讨论】:

    标签: java inheritance constructor superclass


    【解决方案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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2014-06-11
          • 2015-03-12
          • 1970-01-01
          • 2016-02-19
          • 1970-01-01
          • 2014-05-31
          • 1970-01-01
          • 1970-01-01
          • 2015-07-03
          相关资源
          最近更新 更多