簡體   English   中英

Java類初始化順序

[英]Java Class Initialization Order

我從事Java編程已有兩年多了,我決定密切關注成員變量的細節,這使我對類的初始化產生了好奇。

我正在開發一個游戲,在我的類GameStateMenu ,該類擴展了GameState ,我具有以下成員變量:

private int buttonPadding = 10;

我有一個init()方法,該方法是從superclass (從superclass constructor調用)強制繼承的,如果我在該init()方法內部調用System.out.println(buttonPadding) ,它將輸出0

GameStateMenu類內部還有一個update()方法,我在其中放入了同一行代碼System.out.println(buttonPadding) ,並一直打印出10.

GameState類:

public abstract class GameState {

    public GameState() {
        init();
    }

    protected abstract void init();

    public abstract void load();

    public abstract void update();

    public abstract void render();

    public void dispose() {
        return;
    }
}

GameStateMenu類:

public class GameStateMenu extends GameState {

    ...
    private int buttonPadding = 10;

    @Override
    protected void init() {
        System.out.println(buttonPadding); // prints out 0
        ...
    }

    ...

    @Override
    public void update() {
        System.out.println(buttonPadding); // prints out 10
        ...
    }
    ...
}

我不明白的是為什么init()方法被調用時buttonPadding為什么為0 ,但是一旦類被完全初始化並且update()方法被調用后,定期地, buttonPadding已被初始化並輸出10 為什么這樣做和/或Java的初始化順序是什么?

雖然,如果我將buttonPadding靜態,則可以正常工作,但是我仍然對為什么未設置member變量感到好奇。

父類( GameState )在子類( GameStateMenu )之前已完全初始化。 這意味着,在GameState的任何初始化發生之前,發生在構造函數被調用GameStateMenu ,所以在這一點上buttonPadding仍然有一個未分配的int,它是默認值零。 之后GameState被完全初始化, GameStateMenu被初始化-第一buttonPadding被設為零,則該構造被調用。

不請自來的建議:父類構造函數調用子類中定義的方法通常是個壞主意。 它允許子類打破父類中的不變式。 在這種特殊情況下,您可能想要接口而不是抽象類,但是如果不了解更多代碼,就很難說。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM