『壹』 請問java能不能直接用子類初始化父類
其實回答你這個問題挺難的,因為你問的問題本身就是個問題,通過你問的問題,你很多概念其實沒有搞清楚...。
首先子類父類的繼承性問題是類之間的關系,而初始化是對象的問題(當然類也能初始化,但是這種初始化無關於子類父類,這也不牽扯到你問的問題)。對象是沒有父子的問題的,當你實例化一個類的對象出來,這個對象是屬於這個類以及這個類的所有父類的,即是說,如果User繼承Personnel再繼承Object,那麼你實例化一個User對象Jone,那麼Jone既是User的對象同時也是Personnel的對象同樣也是Object的對象,但是這里只有一個對象,沒有三個對象,Jone包含三個類的所有特性,包括屬性,方法等等。所以當你實例化Jone這個對象以後,它其實已經同時初始化三個類所定義的所有屬性。而java機制是從父類到子類初始化的。從這個概念上來講,實例化一個類的對象出來,那麼久必須把這個類的所有父類定義的全部特性全部初始化,而且必須初始化,這不是能不能的問題,是必須這么做。
就目前而言,你對java內部的編譯和運行機制不甚了解的情況下,思考這種問題其實無益,你應該更多的著眼於目前的基礎知識,很多問題在你了解更多的知識以後這些都不是問題,你現在去想這種似是而非的問題,會讓你思維混亂的,因為你這個問題的本身問法就是錯的,從一個錯誤的問題出發,即使別人給你回答,那麼怎麼回答都是錯的,別人需要從很基礎的知識一點一點給你講,大多數人不會浪費這么多時間不會跟你解釋的,你要注重自我學習,不要亂提錯誤的問題。
『貳』 當java父類和子類都有構造函數時,求子類對象初始化過程詳解
你好,初始化過程是這樣的:
1.首先,初始化父類中的靜態成員變數和靜態代碼塊,按照在程序中出現的順序初始化;
2.然後,初始化子類中的靜態成員變數和靜態代碼塊,按照在程序中出現的順序初始化;
3.其次,初始化父類的普通成員變數和代碼塊,在執行父類的構造方法;
4.最後,初始化子類的普通成員變數和代碼塊,在執行子類的構造方法;
最後,給你個例子吧。你運行著幫助理解。
class Super{
public static int a ;
private int b ;
static{
System.out.println("此時a的值為:" + a) ;
a = 10 ;
}
public Super(){
System.out.println("此時a的值為:" + a) ;
System.out.println("此時b的值為:" + b) ;
b = 20 ;
}
{
System.out.println("此時b的值為:" + b);
b = 30 ;
}
}
class Sub extends Super{
public static int aa ;
private int bb ;
static{
System.out.println("此時aa的值為:" + aa) ;
aa = 10 ;
}
public Sub(){
System.out.println("此時aa的值為:" + aa) ;
System.out.println("此時bb的值為:" + bb) ;
bb = 20 ;
}
{
System.out.println("此時bb的值為:" + bb);
bb = 30 ;
}
}
public class ConstructorTest {
public static void main(String[] args) {
new Sub() ;
}
}
『叄』 java中,子類初始化時一定要調用父類的構造方法,不調用行嗎
一定會調用,原因是這樣的。
因為子類繼承了父類,那麼就默認的含有父類的公共成員方法和公共成員變數,這些方法和變數在子類里不再重復聲明。如果你初始化子類的時候,不初始化父類,那麼你通過子類調用父類方法或變數的時候會出現什麼情況呢?當然就是拋異常阿!所以,Java虛擬機會在你初始化子類的時候默認的初始化子類的父類。而且是一層一層的往上遞進!