在學習Java過程中,必須要了解這些基本的東西才能對讀代碼少些困惑,而這些細節是新手必須注意的。
總結:初始化的順序為:先初始化父類的靜態代碼——>初始化子類的靜態代碼——>創建實例時,如果不創建實例,則後面的不執行)初始化父類的非靜態代碼——>初始化父類構造函數——>初始化子類非靜態代碼——>初始化子類構造函數子類繼承父類會先初始化父類,調用父類的構造函數,
子類的構造方法的第一條語句就是調用父類的沒有參數的構造方法,如果你沒有寫出這條語句Java虛擬機就會默認的調用,如果你顯示的寫了這條語句,就一定要寫在構造方法中的第一條語句,不然會報錯
原理簡述:只有在構造方法中調用了父類的構造方法才能繼承父類的相關屬性和方法,要不然子類從哪裡繼承父類的屬性和方法,在實例化子類的時候又沒有和父類有任何關系。
子類的構造函數默認調用和這個構造函數參數一致的父類構造函數,除非在此子類構造函數的第一行顯式調用父類的某個構造函數。
類Example1
class father{
int x=0,y=0;
father(){
System.out.println("now is in father's constructor");
}
father(int x,int y){
this.x=x;
this.y=y;
}
public void print(){
System.out.println("x="+x+";y="+y);
}
}
class son extends father{
son(){
System.out.println("now is in son's constructor");
}
son(int x,int y){
super(x,y);//改變x,y,的值,若無super(x,y),則默認調用father()
}
public void print(){
super.print();
System.out.println("my name is son!");
}
}
public class Example1 {
public static void main (String[] args){
son s=new son();//實例化構造的時候從父類開始調用
s.print();//此處不是構造,是調用
son f=new son(10,20);
f.print();
}
}
運行結果::
now is in father's constructor
now is in son's constructor
x=0;y=0
my name is son!
x=10;y=20
my name is son!
類Example2:
class father{
int x=0,y=0;
father(){
System.out.println("now is in father's constructor");
}
father(int x,int y){
this.x=x;
this.y=y;
}
public void print(){
System.out.println("x="+x+";y="+y);
}
}
class son extends father{
son(){
System.out.println("now is in son's constructor");
}
son(int x,int y){
//改變x,y,的值
System.out.println("s213");
}
public void print(){
//引用父類的print函數
System.out.println("my name is son!");
}
}
public class Example2 {
public static void main (String[] args){
son s=new son();//實例化構造的時候從父類開始調用
s.print();//此處不是構造,是調用, oh,yeah!
son f=new son(10,20);//先調用父類的father(){System.out.println("now is in }
//而不是father(int x,int y){this.x=x;this.y=y;}
f.print();
}
}
運行結果
now is in father's constructor
now is in son's constructor
my name is son!
now is in father's constructor
s213
對比這兩個類的注釋和結果相信你就會明白了。