java构造方法和实例化,10. JavaSE-子类实例化过程 构造方法间调用
子類的實例化過程:
子類中所有的構造函數默認都會訪問父類中空參數的構造函數。
class?Parent
{
Parent(){
System.out.println("parent?class?run");
}
}
class?Children?extends?Parent
{
Children(){
//super();//調用的就是父類空參數的構造函數
System.out.println("children?class?run");
//return;
/*說明:此處被注釋掉的super和return都是默認就有的語句。*/
}
}
class? DemoChildren
{
public?static?void?main(String[]?args)
{
System.out.println("Hello?World!");
}
}
為什么子類實例化的時候要訪問父類構造函數?
因為子類繼承父類,獲取到了父類中內容(屬性),所以在使用父類內容之前,要先看父類是如
何對自己的內容進行初始化的。所以子類在構造對象時,必須訪問父類中的構造函數。為了完成
這個必須得動作,就在子類的構造函數中加入super()語句。如果父類中沒有定義空參數的構造函
數,那么子類的構造函數必須用super明確調用父類中的哪個構造函數。同時子類構造函數中如果
使用this調用了本類構造函數時,那么super就沒有了,因為super和this都只能定義在第一行,所以
只能有一個,但是可以保證的是,子類中肯定會有其他的構造函數訪問父類的構造方法。
注意:super語句必須要定義在子類構造函數的第一行,因為父類的初始化動作要先完成。
Java中,所有的類都是Object的子類。Object是最頂層的類,也就是Java中的God。
一個對象的實例化過程:
1.?JVM讀取指定路徑下的.class文件,并加載進內存,并會先加載父類(如果有直接父類的情況下)
2.?在堆內存中開辟空間,分配地址
3.?并在對象空間中,對對象中的屬性進行默認初始化
4.?調用對應的構造函數進行初始化
5.?在構造函數中,第一行會先調用父類中的構造函數進行初始化
6.?父類初始化完畢后,在對子類的屬性進行顯示初始化
7.?在進行子類構造函數的特定初始化
8.?初始化完畢后,將地址賦值給引用變量
注意:通過super初始化父類內容時,子類的成員變量并未顯式初始化,等super()父類初始化完
畢后,才進行子類的成員變量顯示初始化。
構造函數之間互相調用:
類中構造函數之間可以相互調用。
class?Parent
{
Parent(){
System.out.println("parent?class?run");
}
}
class?Children?extends?Parent
{
Children(){
this(20);
System.out.println("children?class?run");
}
Children(int age){
System.out.println("This boy age is "+age);
}
}
class? DemoChildren
{
public?static?void?main(String[]?args)
{
new Children();
// System.out.println("Hello?World!");
}
}
總結
以上是生活随笔為你收集整理的java构造方法和实例化,10. JavaSE-子类实例化过程 构造方法间调用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式
- 下一篇: java jlabel里面加button