【问题标题】:protected and private constructor受保护和私有构造函数
【发布时间】:2014-08-23 04:39:39
【问题描述】:

这种受保护的和私有的构造函数组合如何工作?

class ClassA {
    public int numberOfInstances;
    protected ClassA(int numberOfInstances) {
        this.numberOfInstances = numberOfInstances;
    }
}
public class ExtendedA extends ClassA {
    private ExtendedA(int numberOfInstances) {
         super(numberOfInstances);
    }
}
public static void main(String[] args) {
    ExtendedA ext = new ExtendedA(420);
    System.out.print(ext.numberOfInstances);
}

【问题讨论】:

  • 你的代码能编译吗?
  • 你从哪里得到这个代码?
  • 这不起作用。起初我在想,也许整个 code-sn-p 应该被包装在某种 public class Foo { ... } 中(在这种情况下,Foo 中的任何代码都可以访问任何类的 private 成员,包括构造函数在Foo) 中声明,但后来我意识到如果是这样,那么您的静态方法main 将无法实例化您的非静态嵌套类ExtendedA。所以,-1。请发布一个最小的、完整的、可验证的示例来证明您的问题。
  • @ruakh 正如你所说,不能有任何其他类 foo 因为 ExtendedA 已经是公开的,并且没有其他类可以公开
  • @SpringLearner 这不是真的,因为如果所有这些类都包装在 public class Foo { ... } 中,那么 ExtendedA 将是一个嵌套类,并且允许它们是私有的、公共的、受保护的或包私有的。 docs.oracle.com/javase/tutorial/java/javaOO/nested.html

标签: java class constructor


【解决方案1】:

我看过这个问题,它是为您准备 SUN 认证的众多示例问题之一。您可以在此文档中找到问题:Sun Certification

有些网站有这个问题,但是它们缺少组件或编写错误无法编译,但答案仍然是420;

我将承担 OP 副本并从其中一个站点粘贴代码。

正确的代码应该是两个独立的类,写成:

class ClassA {

    public int numberOfInstances;

    protected ClassA(int numberOfInstances) {

        this.numberOfInstances = numberOfInstances;
    }
}

public class ExtendedA extends ClassA {

    private ExtendedA(int numberOfInstances) {

         super(numberOfInstances);
    }

    public static void main(String[] args) {

        ExtendedA ext = new ExtendedA(420);
        System.out.print(ext.numberOfInstances);
    }
}

回答有关其工作原理的问题:

子类可以通过调用 super(...) 访问其父类的构造函数,因此在本例中将 420 分配给 numberOfInstances。如果您不熟悉继承,我建议您自己研究一下,但是,简而言之,子类或子类继承其父类的所有公共和受保护成员。

所以当你调用ext.numberOfInstances时,输出将是420。这个值是通过先调用子类构造函数来赋值,然后子类构造函数调用父构造函数使用super(420 ) 然后将值分配给 numberOfInstances

【讨论】:

    猜你喜欢
    • 2010-12-16
    • 2019-08-24
    • 2012-12-24
    • 2016-04-07
    • 2011-03-15
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多