2017-10-19 82 views
-1

我想要沒有人重寫我的構造函數試圖使用私有方法,但它給我的錯誤如何停止覆蓋我的構造函數如何停止構造函數從繼承在繼承java派生類嘗試使用私人但不工作

class bc { 

    int a; 

    bc() { 
    System.out.println("hi this is construvtor "); 
    a = 10; 
    System.out.println("the value of a=" + a); 
    } 
} 

class dc extends bc { 

    int b; 

    dc() { 

    a = 20; 
    System.out.println("derived dc"); 
    System.out.println("derived value of a=" + a); 
} 

} 
public class sup { 
    public static void main(String[] args) 

    { 
    dc s1 = new dc(); 
    } 

} 
+1

您在包括錯誤,也沒有展示你是如何使用的私有方法不是。 – Tschallacka

+1

構造函數沒有被覆蓋......所以這會很複雜。你可以重載一個構造函數。但是在一個子類中,你需要再次定義構造函數,並且根據你想要使用的「supe」構造函數調用'super(...)'。但是這不是過分 – AxelH

+1

每個類都可以有它自己的構造函數,並且你不能禁止它。你可以做的不是讓你的課程通過在你的課堂定義中增加「final」來擴展。 – Alex

回答

2

構造函數沒有被覆蓋,方法是。
當您在子類中使用與父類中的哪一個相同的參數添加構造函數時,它不覆蓋父類中的哪一個。
它只提供一種方法來以調用父類構造函數的相同方式實例化子類。

在父類中使用private構造函數將使該類不能繼承,因爲子類構造函數需要調用父構造函數,並且父類中的構造函數會阻止它。

+1

我會補充說,如果我們將每個構造函數設置爲'private',我們可以將該類設置爲'final',以直接通知該類不能被繼承。這並不多,但... – AxelH

+0

@AxelH在大多數情況下,它是正確的,它使事情更清晰。好點子。請注意,你有一個角落的情況:你仍然可以讓這個類沒有'final'來從類本身創建它的匿名類。 – davidxxx

+0

的確,好點!即使我不喜歡那個詞(我發現它也是一個懶惰的「特徵」),這個班可以被看作是有效的final_ ^^) – AxelH

0

構造函數不能被覆蓋,因爲它們不是類的成員。子類構造函數默認調用超類默認構造函數。如果你不想讓它被調用,那麼你可以在超類中創建一個參數化的構造函數,並在子類的構造函數中調用它。

class bc { 
     int a; 
     bc() { 
     System.out.println("hi this is construvtor "); 
     a = 10; 
     System.out.println("the value of a=" + a); 
     } 
     bc(int i){} 
    } 

    class dc extends bc { 

    int b; 
    dc() { 
     super(1); // invoking super class parameterized constructor 
     a = 20; 
     System.out.println("derived dc"); 
     System.out.println("derived value of a=" + a); 
    } 

} 
public class sup { 
    public static void main(String[] args) 
    { 
    dc s1 = new dc(); 
    } 

} 
0

構造函數沒有被覆蓋是正確的。但我想根據您的查詢添加一些信息。 只有在具有非私有說明符的父類上有另一個構造方法時,纔可以使父類的構造方法爲private,並且在這種情況下,必須使用super從子類構造方法中調用該非私有超類構造方法。

N.B .:儘管在做這樣的事情時沒有實際的用例。只是爲了您的查詢privateconstructor。嘗試下面的代碼:

class bc { 

    int a; 

    private bc() { 
     System.out.println("-----------------------"); 
    } 
    private bc(int s){ 
     System.out.println("write logic"); 
    } 
    bc(int a,int b){ 
     System.out.println("***************"); 
    } 
} 

class dc extends bc { 

    int b; 

    dc(int a) { 
     super(8,9); 
    } 

} 

public class sup { 
    public static void main(String[] args) 

    { 
     new dc(9); 
    } 

}