为什么如果我将其默认构造函数声明为private,则无法将类子类化

时间:2014-05-14 18:44:26

标签: java constructor

  

在一个类中,我可以使用不同的参数类型拥有尽可能多的构造函数。我将所有构造函数设置为私有,它没有给出任何错误,因为我的隐式默认构造函数是public但是当我将隐式默认构造函数声明为private时,它在扩展类时显示错误。的 WHY吗

这很好用

public class Demo4  {
    private String name;
    private int age;
    private double sal;

    private Demo4(String name, int age) {
        this.name=name;
        this.age=age;   
    }

    Demo4(String name) {
        this.name=name;
    }

    Demo4() {
        this("unknown", 20);
        this.sal=2000;
    }

    void show(){
        System.out.println("name"+name);
        System.out.println("age: "+age);
    }
}

这不能继承

public class Demo4  {
    private String name;
    private int age;
    private double sal;

    private Demo4(String name, int age) {
        this.name=name;
        this.age=age;
    }

    Demo4(String name) {
        this.name=name;
    }

    private Demo4() {
        this("unknown", 20);
        this.sal=2000;
    }

    void show() {
        System.out.println("name"+name);
        System.out.println("age: "+age);
    }
}

3 个答案:

答案 0 :(得分:3)

如果超类中的任何构造函数都是可访问的,则可以对其进行子类化,只需在子类的构造函数中使用super(..)调用可访问的超级构造函数。

我可以像这样继承你的第二个例子:

     super("A string");

答案 1 :(得分:3)

  

如果我将其默认构造函数声明为私有

,则无法将类子类化

子类中的构造函数必须调用超级构造函数(可以是隐式或显式),以便完全构造对象。超级构造函数调用链一直持续到Object类,即Java中所有类的超类。

如果任何超级构造函数对子类不可见,那么就无法完全构造then对象。

解决这个问题的一种方法是在超类protected中创建构造函数。这样,超级构造函数只对子类可见。

答案 2 :(得分:1)

一些额外的信息,对于默认构造函数,始终存在对super()的隐式调用。相反,对于非默认构造函数,应该有一个显式调用(如果父类中没有可访问的构造函数)到可访问的父类的构造函数,或者是同一个类的构造函数。例如

package com.test;

class A {

    private A() {
      //implicit call to java.lang.Object.super()
    }

    public A(String a) {
      //implicit call to java.lang.Object.super()
    }
}

public class B extends A {

    public B(String a, String b) {
        this(a);
    }

    public B(String a) {
        super(a);
    }

}