[英]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.