不容許使用 Java 靜態構造函數,可是爲何呢?在深刻探討不容許使用靜態構造函數的緣由以前,讓咱們看看若是要使 構造函數靜態化 會發生什麼。java
假設咱們有一個定義爲的類:程序員
public class Data { private int id; public static Data() {} }
若是您嘗試編譯此類,則會在 Data 類型的構造函數中收到一條錯誤消息,做爲非法修飾符。僅容許公開,受保護和私有。面試
咱們知道靜態方法,靜態塊或變量屬於該類。而構造函數屬於該對象,並在使用 new 運算符建立實例時調用。因爲構造函數不是類屬性,所以有理由認爲它不能是靜態的。算法
咱們知道靜態方法不能訪問非靜態變量。靜態塊也是如此。函數
如今,構造函數的主要目的是初始化對象變量。所以,若是咱們將構造函數設置爲靜態,則沒法初始化對象變量。這將破壞使用建立對象的構造函數的所有目的。所以,使構造函數爲非靜態是合理的。this
注意,咱們不能this
在靜態方法中使用引用對象變量。下面的代碼將定義編譯錯誤,由於:不能在靜態上方中使用它。code
public static void main(String args []){ System.out.println(this.id); }
在Java中,每一個類都隱式擴展了對象類。咱們能夠定義一個類層次結構,其中子類構造函數調用超類構造函數。這是經過super()
方法調用完成的。大多數狀況下,JVM自動調用超類構造函數,但有時若是超類中有多個構造函數,咱們必須手動調用它們。視頻
讓咱們來看一個super()
用法示例。對象
package com.journaldev.util; class Data { Data() { System.out.println("Data Constructor"); } } public class DataChild extends Data{ public DataChild() { super(); //JRE calls it explicitly, calling here for explanation System.out.println("DataChild Constructor"); } public static void main(String args[]) { DataChild dc = new DataChild(); } }
上面的程序將產生如下輸出。blog
Data Constructor DataChild Constructor
若是,您看一下super()
方法,它不是靜態的。所以,若是構造函數轉換靜態,咱們將沒法使用它,這將破壞java中的繼承性。
若是要在類中初始化一些靜態變量,則可使用靜態塊。請注意,咱們沒法將參數傳遞給靜態塊,所以,若是您要初始化靜態變量,則也能夠在常規構造函數中執行此操做。
class Data { public static int count; static { count = 0; } Data(int c) { //not recommended since the count is class variable //and shared among all the objects of the class count=c; } }
咱們說明了爲何不容許使用Java靜態構造函數。咱們可使用靜態塊以及構造函數自己來初始化靜態變量。
「不積跬步,無以致千里」,但願將來的你能:有夢爲馬 隨處可棲!加油,少年!
關注公衆號:「Java 知己」,天天更新Java知識哦,期待你的到來!
每日福利