[英]new keyword in java
java新手,仍然在努力使用新的關鍵字和繼承:
public class A1 {
void a_method (){
System.out.println("Inside A1 method");
}
}
public class A2 extends A1{
void a_method(){
System.out.println("Inside A2 method");
}
}
public class TestA1A2 {
public static void main(String[] args) {
A1 a1 = new A1();
A1 a2 = new A2(); //not sure if it created object of A1 or A2
A2 a3 = new A2();
a1.a_method();
a2.a_method();
a3.a_method();
}
}
我正在努力理解新關鍵字,如果在上面的代碼中:
A1 a2 = new A2(); //not sure if it created object of A1 or A2
將a2作為A1或A2的對象? 從輸出我可以看到它調用A2的方法,但我真的沒有得到新的關鍵字。 並且當A2延伸A1時,是否可以調用A1的方法?
A1 a2 = new A2();
此代碼創建一個A2對象,但您只能使用a2訪問A1類的方法。 如果A2中的方法被覆蓋,則調用A2的方法。
你創建了一個新的A2()對象,因為你說'new A2()'。 由於A2也是A1,你可以像它的A1一樣引用它:
A1 a1 = new A2();
A2 a2 = new A2();
在上面的例子中,在a1中,你可以在a1上調用A1的所有方法。 對於a2,你可以調用a1和a2的所有方法,因為你繼承了A1的方法。
A1 a2 = new A2(); 這將創建A2類型的對象。
這里發生了什么......
您正在創建A2類型的對象並指定類型A1的引用。 當你執行新的A2()時,它將調用構造函數A2() (它是默認構造函數)並創建一個A2類型的Object。
public class A2 extends A1{
public A2(){
super();
}
void a_method(){
System.out.println("Inside A2 method");
}
}
由於A2
延伸A1
, A2
是 A1
。 它是A1
的特殊類型 。 這是A1
一切,但A2
可能有一些獨特之處。 一個類比就是貓是一種哺乳動物。 在Java中, Cat
會擴展Mammal
。
A1 a2 = new A2();
由於new A2()
此行創建A2
的實例。 然而,這里的棘手的一點是,展望未來,它會像一個待處理A1
,因為A1 a2 =
。 讓我從線上刪除一點點噪音:
A1 xx = new A2();
這完全相同,但生成的對象稱為xx
。 因此,我們正在創建一個A2
類的實例,我們將其稱為xx
,並且繼續前進,我們將它視為A1
。
A1是A2的父類,
A1 a2 = new A2();
創建其父類為A1的A2實例。 但由於A2繼承自A1,a2也是A1。
這稱為多態性 。 由於A2
延伸A1
,你可以聲明A1
為A2
,並且會給您可以訪問所有的內部非重寫的方法A1
和所有被覆蓋的A1
內部方法A2
(順便說一句它的一個很好的做法,以使用@Override
注釋,當你重寫) 。
在這種情況下,由於A2
覆蓋a_method()
當你做a2.a_method()
你會被訪問A2's
版本a_method()
來自javadoc的解釋:
多態性的字典定義是指生物學中的原理,其中生物體或物種可以具有許多不同的形式或階段。 這個原則也可以應用於面向對象的編程和Java語言之類的語言。 類的子類可以定義它們自己的唯一行為,但仍然共享父類的一些相同功能。
當您從Java繼承類時,繼承的類被稱為超類。 把它想象成更普通的課程。 繼承的類更專業。
A1 a2 = new A2();
在這種情況下,a2(類型A1)是通用類,通過操作,您可以使用A2中定義的更專用的類型
A2
對象也是 (擴展) A1
對象。 所以你可以用它作為A2
和 A1
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.