構造器和多態
阿新 • • 發佈:2018-04-21
多態 rri clas 基本介紹 默認 tro 避免 未在 this
一.基本介紹
1.1構造器默認為static方法——static方法默認為final方法;
1.2基類構造器調用順序
檢查對象是否被爭取構造是構造器的一項任務。
1.1導出類會按照繼承層次逐漸向上調用基類構造器,1.2然後按照聲明順序調用成員初始化方法,1.3最後調用導出類構造器主體;
如果沒有明確調用(super關鍵字)哪個基類構造器,則默認調用(無參),若基類沒有默認構造器的話編譯報錯。示例如下:
//編譯失敗
class Grandfather{
int tag=0;
public Grandfather(int tag) {
this.tag = tag;
}
}
class Father extends Grandfather{
public Father() {
super(1);//去掉這一句,則默認調用基類無參構造函數,編譯失敗
System.out.println("father");
}
}
//1.1導出類會按照繼承層次逐漸向上調用基類構造器,1.2然後按照聲明順序調用成員初始化方法,1.3最後調用導出類構造器主題;
class Grandfather{
int tag=0;
public Grandfather(int tag) {
System.out.println("ground father" );
this.tag = tag;
}
}
class Father extends Grandfather{
public Father() {
super(1);
System.out.println("father");
}
}
class Son extends Father{
public Son() {
System.out.println("son");
}
}
public class Demo01 {
public static void main(String[] args) {
new Son();
}
}
output:
ground father
father
son
1.3構造器內部的多態方法的行為
多態方法即導出類重寫父類的方法:
- 如果這個方法在父類構造器中使用,則調用的是子類重寫後的方法;
- 假若這個方法調用了子類某個變量,則這個變量因為還未在導出類中用其初始化方法,此時分配給變量的存儲空間初始化成二進制的0;
示例如下:
class father{
public father() {
func();
}
void func(){ }
}
class son extends father{
int tag=1;
public son(int tag) {
// System.out.println("tag = "+tag);這裏默認調用了父類的構造方法;
this.tag = tag;
System.out.println("tag = "+tag);
}
@Override
void func() {
System.out.println("tag = "+tag);
}
}
public class Demo02 {
public static void main(String[] args) {
new son(1);
}
}
output:
tag = 0//分配給對象的存儲空間初始化為二進制的零;
tag = 1
由上述可知初始化的實際順序為:
- 將分配給對象的存儲空間初始化為二進制的零;
- 調用基類構造器,構造函數中調用方法為覆蓋後的方法;
- 導出類中按照聲明順序調用成員的初始化方法;
- 調用導出類構造器主體;
[註]
- 導出類應該避免調用其他方法,或者調用基類中final方法——不能被改變的方法;
- 導出類能夠調用基類構造函數,但沒有繼承;
構造器和多態