繁体   English   中英

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

[英]why a class can not be subclassed if i declare its default constructor as private

在一个类中,我可以使用任意数量的构造函数来使用不同的参数类型。 我将所有构造函数都设为私有,但未给出任何错误,因为我的隐式默认构造函数是public,但是当我将隐式默认构造函数声明为private时,在扩展类时显示错误。 为什么?

这很好

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);
    }
}

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

我可以像这样子化您的第二个示例:

     super("A string");

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

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

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

解决此问题的一种方法是使超类中的构造函数protected 这样,超级构造函数仅对子类可见。

一些额外的信息,对于默认的构造函数,总会隐式调用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);
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM