爲何不容許使用 Java 靜態構造函數?

不容許使用 Java 靜態構造函數,可是爲何呢?在深刻探討不容許使用靜態構造函數的緣由以前,讓咱們看看若是要使 構造函數靜態化 會發生什麼。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中的繼承性。

 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知識哦,期待你的到來!

  • 發送「Group」,與 10 萬程序員一塊兒進步。
  • 發送「面試」,領取BATJ面試資料、面試視頻攻略。
  • 發送「玩轉算法」,領取《玩轉算法》系列視頻教程。
  • 千萬不要發送「1024」...

在這裏插入圖片描述 每日福利

相關文章
相關標籤/搜索