问题与思考3
靜態初始化塊的執行順序是:
? ? 先初始化父類(最高層次的)的靜態初始化塊,父類的無參構造器,在進行子類的靜態初始化塊,子類的無參構造器;
然后是父類的普通初始化塊,子類的普通初始化塊;父類的帶參構造器,子類的帶參構造器。
靜態初始化塊只執行一次。?創建子類型的對象時,也會導致父類型的靜態初始化塊的執行。
?
可以查詢創建了多少個類
public class Test{
??? public static void main( String args[]){
??????? Test a= new Test();
??????? a.OutputInformation();
??????? Test b= new Test();
??????? b.OutputInformation();
??????? Test c= new Test();
??????? c.OutputInformation();
??????? Test d= new Test();
??????? d.OutputInformation();
??? }
?
??????? static int num=0;
??????? public Test(){
?????????? num++;
??????? }
??????? public void OutputInformation(){
?????????? System.out.println("已經創建了"+num+"個對象!");
??????? }
??? }
?
思考:
?
一、對象變量也可以直接使用“==”判等嗎?
運行以下代碼將得到什么結果
?
運行結果
?
對象變量在比較是比較多是兩個變量的地址,所以無法對兩個變量內容直接進行比較,但是可以重寫調用基類中的equals();方法。
一、以下代碼無法編譯,哪里出錯了
運行結果
未定義函數Foo();如果類提供了一個自定義的構造方法,將導致系統不再提供默認構造方法。
?
三、如果一個類中既有初始化塊,又有構造方法,同時還設定了字段的初始值,誰說了算?
?
?
?
運行結果
可以在類中使用“{”和“}”將語句包圍起來,直接將其作為類的成員。類的這種“沒有名字”的“成員”,多用于初始化類的字段。
1)所有類的變量都默認初始化null,數字類的原始數據類型默認初始化為0。
2)執行類成員定義的默認值或初始化塊,優先于最新的那個,如上式的100。
3)執行類的構造函數,有多個構造函數,通過參數區分執行,創建類的對象時,就會立即執行。因此,適合于封裝那些“對象創建時必須執行的代碼”。
四、請運行TestStaticInitializeBlock.java示例,觀察輸出結果,總結出“靜態初始化塊的執行順序”。
運行結果
?
靜態初始化塊的輸出只出現了一次,也就是說每個類的靜態初始化塊都只在第一次實例化該類對象時執行一次。
五、
如何在靜態方法中訪問類的實例成員?
public class Example
{
?int x = 3;//類的實例變量,初始化值為3
?static int? y = 4;//類的靜態變量,初始化值為4
?public static void method()//靜態方法
? {??
?? System.out.println("實例變量x = " + new Example().x);//在靜態方法中訪問類的實例變量需首先進行類的實例化
?? System.out.println("靜態變量y = " + y);//在靜態方法中可直接訪問類的靜態變量
? }
?
?public static void main(String[] args)
??? {
???????? Example.method();
???????? Example ex = new Example();
?? ?????System.out.println("x = " + ex.x);
??? }
}
在外部調用靜態方法時,可以使用"類名.方法名"的方式,也可以使用"對象名.方法名"的方式。而實例方法只有后面這種方式。也就是說,調用靜態方法可以無需創建對象。 靜態方法在訪問本類的成員時,只允許訪問靜態成員(即靜態成員變量和靜態方法),而不允許訪問實例成員變量和實例方法;實例方法則無此限制?
轉載于:https://www.cnblogs.com/wjwjs/p/7700688.html
總結
- 上一篇: 前端JS基础
- 下一篇: R语言:随机抽样(sample函数)