1. 程式人生 > >課後作業3

課後作業3

 

1.程式碼找錯(動手動腦)

package DaiMaZhaoCuo;

public abstract class Test {
public static void main(String []args) {
    Foo obj1=new Foo();
}
}
public class Foo {
int value;
public Foo(int initvalue) {
    value=initvalue;
}
}

Foo類中定義帶參的建構函式,而Foo類定義了建構函式系統就不會自動生成建構函式,所以Foo類就沒有無參的建構函式,所以初始化會出錯。

2.Java欄位初始化規律

package InitializeBlockClass;

public class InitializeBlockClass {
    {
        field=200;
    }
    public int field=100;
    public InitializeBlockClass(int value) {
        this.field=value;
    }
    public InitializeBlockClass() {
        
    }
    public static void main(String[] args) {
        InitializeBlockClass obj
=new InitializeBlockClass(); System.out.println(obj.field); obj=new InitializeBlockClass(300); System.out.println(obj.field); } }

執行結果:

從執行結果得出,初始化規律為:初始化塊和欄位的初始值誰排在前面先執行誰,最後執行建構函式。

3.靜態初始化塊的執行順序

class Root
{
    static{
        System.out.println("Root的靜態初始化塊");
    }
    {
        System.out.println(
"Root的普通初始化塊"); } public Root() { System.out.println("Root的無引數的構造器"); } } class Mid extends Root { static{ System.out.println("Mid的靜態初始化塊"); } { System.out.println("Mid的普通初始化塊"); } public Mid() { System.out.println("Mid的無引數的構造器"); } public Mid(String msg) { //通過this呼叫同一類中過載的構造器 this(); System.out.println("Mid的帶引數構造器,其引數值:" + msg); } } class Leaf extends Mid { static{ System.out.println("Leaf的靜態初始化塊"); } { System.out.println("Leaf的普通初始化塊"); } public Leaf() { //通過super呼叫父類中有一個字串引數的構造器 super("Java初始化順序演示"); System.out.println("執行Leaf的構造器"); } } public class TestStaticInitializeBlock { public static void main(String[] args) { new Leaf(); } }

執行結果:

執行順序為,由父類到子類先執行靜態初始化塊,而後是普通,無引數和有參構造器。

4.靜態方法訪問類的例項成員

package num;

public class Num {
public int i=5;
public static void main(String []args) {
    Num j=new Num();
    System.out.println(j.i);
}
}

執行結果:

 

 可以在靜態方法中定義類的物件,這樣就可以呼叫例項成員了。