在類內部:初始化的順序
靜態的成員變數;
普通的成員變數;
構造器的呼叫。
在派生類中:初始化的順序
呼叫基類的構造器
按宣告順序呼叫成員的初始化方法
呼叫派生類構造器主體
大多數類的初始化都是按照這些順序結合在一起的。
下面是乙個例子:
public
class
test
extends
sub public
static
void
main(string args)
public
static
intgetfield2()
}class super
public
int field = 0;
public
static
int field2 = getfield2();
public
void
fun1()
public
intgetfield()
public
static
void
fun2()
public
static
intgetfield2()
}class sub extends super
public
int field = getfield();
public
static
int field2 = getfield2();
public
void
fun1()
public
intgetfield()
public
static
void
fun2()
public
static
intgetfield2()
}
下面我們看看輸出的結果:
output:
super static fun2
substatic fun2
test static
super()
sub fun1
sub()
test()
我們在main()方法中呼叫了new乙個test的物件,由於test繼承了sub,而sub繼承了super。(當進行繼承時,我們已經知道基類的一切,並且可以訪問基類中任何宣告為public和protected的成員。這意味著在派生類中,必須假定基類的所有成員都是有效的。一種標準方法是,構造動作一經發生,那麼物件所有部分的全體成員都會得到構建。然而,在構造器內部,我們必須確保所要使用的成員都已經構建完畢。為確保這一目的,唯一的辦法就是首先呼叫基類的構造器。那麼在進入派生類構造器時,在基類中可供我們訪問的成員都已得到初始化。)
只要程式載入了類的位元組碼,不用建立任何例項物件,靜態變數就會被分配空間,靜態變數就可以被使用了。
所以static變數是最先初始化的,並根據基類到派生類的順序。
當static變數初始化之後,下乙個執行的就是基類super的例項變數,然後在輪到super的構造器。
接著就是sub的例項變數和構造器。我們可以看到sub的構造器執行之前有sub fun1的輸出。這就證明是先初始化例項變數再執行構造器的。
當基類都初始化完成時,在輪到派生類。
例項變數屬於某個物件的屬性,必須建立了例項物件,其中的例項變數才會被分配空間,才能使用這個例項變數。而靜態變數不屬於某個例項物件,而是屬於類,所以也稱為類變數,只要程式載入了類的位元組碼,不用建立任何例項物件,靜態變數就會被分配空間,靜態變數就可以被使用了。總之,例項變數必須建立物件後才可以通過這個物件來使用,靜態變數則可以直接使用類名來引用。
也就是說例項變數在每個物件的建立都會初始化,而靜態變數只會在第一次載入類時初始化(只會初始化一次)。
下面是乙個例子:
publicclass explicitstatic
static cups cup1 = new cups();
static cups cup2 = new cups();
}class cup
void f(int marker)
}class cups
cups()
public
intgetfield()
}
output:
cup(1)
cup(2)
field
cups()
field
cups()
inside
main()
f(99)
成功構建 (總時間: 1 秒)
根據上面所說的順序,相信大家都會看得懂的。 類成員初始化
一 預設呼叫的無參建構函式 include include using namespace std class studentid class student int main 8 91011class student 20 2122 intmain 執行結果 重新設計建構函式,對s物件進行初始化,...
初始化C 類成員
問題 我的問題是關於初始化c 類成員的。我見過許多這樣的 包括在你的欄目中也見到過 csomeclass csomeclass x 0 y 1 而在別的什麼地方則寫成下面的樣子 csomeclass csomeclass x 0 y 1 我的一些程式設計師朋友說第二種方法比較好,但他們都不知道為什麼...
類的成員初始化
類的每個基本型別資料成員都有乙個初始值 類中定義乙個物件引用時,如果不初始化,此引用會獲得乙個特殊值 null。如下 public class initialvalues public static void main string args output data type initial val...