簡體   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