錯題(父類構造器)

What will be printed when you execute the following code?
 
class C {
    C() {
        System.out.print( "C" );
    }
}
 
class A {
    C c = new C();
 
    A() {
        this ( "A" );
        System.out.print( "A" );
    }
 
    A(String s) {
        System.out.print(s);
    }
}
 
class Test extends A {
    Test() {
        super ( "B" );
        System.out.print( "B" );
    }
 
    public static void main(String[] args) {
        new Test();
    }
}
 
answer:
CBB
 
解析
首先new了一個子類對象,那麼就要調用構造方法來初始化該子類對象,可是該類繼承自A,因此要先調用父類的構造方法,這裏經過super("B")顯示 的調用了父類的帶參構造。執行父類的帶參構造前要先對父類中的對象進行初始化,對父類中的c成員進行初始化,調用了C類的無參構造,因此調用順序爲:
先調用C類的無參構造
再調用A類的帶參構造
最後調用調用子類的構造
 
重載:
重寫是子類繼承父類方法並對其進行修改,可選擇調用父類方法或子類重寫後的同名方法
重載是在一個類能夠存在同名但參數列表不一樣的方法,可根據傳入的參數調用相應的方法
 
 
volatile:

一旦一個共享變量(類的成員變量、類的靜態成員變量)被volatile修飾以後,那麼就具有了兩層語義:java

1)保證了不一樣線程對這個變量進行操做時的可見性,即一個線程修改了某個變量的值,這新值對其餘線程來講是當即可見的。緩存

2)禁止進行指令重排序。多線程

volatile只提供了保證訪問該變量時,每次都是從內存中讀取最新值,並不會使用寄存器緩存該值——每次都會從內存中讀取。this

而對該變量的修改,volatile並不提供原子性的保證。spa

因爲及時更新,極可能致使另外一線程訪問最新變量值,沒法跳出循環的狀況線程

多線程下計數器必須使用鎖保護。code

相關文章
相關標籤/搜索