java中父類宣告子類例項化
問題:
1、比如兩個類。父類:Father ,子類 Child extends Father。在使用時候,這樣寫:
Father child==new Child();
這樣看來,宣告的時候,是父類,而在產生物件的時候,實際的物件是子類。怎麼理解???
知識點:
Java的多型性
物件導向程式設計有三個特徵,即封裝、繼承和多型。
封裝隱藏了類的內部實現機制,從而可以在不影響使用者的前提下改變類的內部結構,同時保護了資料。
繼承是為了重用父類程式碼,同時為實現多型性作準備。
那麼什麼是多型呢?方法的重寫、過載與動態連線構成多型性。
Java之所以引入多型的概念,原因之一是它在類的繼承問題上和C++不同,後者允許多繼承,這確實給其帶來的非常強大的功能,但是複雜的繼承關係也給C++開發者帶來了更大的麻煩,為了規避風險,Java只允許單繼承,派生類與基類間有IS-A的關係(即“貓”is a “動物”)。這樣做雖然保證了繼承關係的簡單明瞭,但是勢必在功能上有很大的限制,所以,Java引入了多型性的概念以彌補這點的不足,此外,抽象類和介面也是解決單繼承規定限制的重要手段。同時,多型也是物件導向程式設計的精髓所在。
解釋:
要理解多型性,首先要知道什麼是“向上轉型”。
我定義了一個子類Cat,它繼承了Animal類,那麼後者就是前者是父類。我可以通過
Cat cat = new Cat();
例項化一個Cat的物件,這個不難理解。但當我這樣定義時:
Animal cat = new Cat();
這代表什麼意思呢?
很簡單,它表示我定義了一個Animal型別的引用,指向新建的Cat型別的物件。由於Cat是繼承自它的父類Animal,所以Animal型別的引用是可以指向Cat型別的物件的。那麼這樣做有什麼意義呢?
因為子類是對父類的一個改進和擴充,所以一般子類在功能上較父類更強大,屬性較父類更獨特,定義一個父類型別的引用指向一個子類的物件既可以使用子類強大的功能,又可以抽取父類的共性。
所以,父類型別的引用可以呼叫父類中定義的所有屬性和方法,而對於子類中定義而父類中沒有的方法,它是無可奈何的;
同時,父類中的一個方法只有在在父類中定義而在子類中沒有重寫的情況下,才可以被父類型別的引用呼叫;
對於父類中定義的方法,如果子類中重寫了該方法,那麼父類型別的引用將會呼叫子類中的這個方法,這就是動態連線。
看下面這段程式:
class Father{
public int i=1;
public void func1(){
func2();
}
//這是父類中的func2()方法,因為下面的子類中重寫了該方法所以在父類型別的引用中呼叫時,這個方法將不再有效
//取而代之的是將呼叫子類中重寫的func2()方法
public void func2(){
System.out.println(i);
System.out.println("AAA");
}
}
class Child extends Father{
public int i=2;
//func1(int i)是對func1()方法的一個過載由於在父類中沒有定義這個方法,所以它不能被父類型別的引用呼叫
//所以在下面的main方法中child.func1(68)是不對的
public void func1(int i){
System.out.println("BBB");
}
//func2()重寫了父類Father中的func2()方法如果父類型別的引用中呼叫了func2()方法,那麼必然是子類中重寫的這個方法
public void func2(){
System.out.println(i);
System.out.println("CCC");
}
}
public class Test {
public static void main(String[] args) {
Father child = new Child();
System.out.println(child.i);
child.func1();//列印結果將會是什麼?
}
}
上面的程式是個很典型的多型的例子。子類Child繼承了父類Father,並過載了父類的func1()方法,重寫了父類的func2()方法。過載後的func1(int i)和func1()不再是同一個方法,由於父類中沒有func1(int i),那麼,父類型別的引用child就不能呼叫func1(int i)方法。而子類重寫了func2()方法,那麼父類型別的引用child在呼叫該方法時將會呼叫子類中重寫的func2(),而不會呼叫自身的func2()。
那麼該程式將會列印出什麼樣的結果呢?很顯然,應該是
1
2
CCC
總結:
對於多型,可以總結它為:
一、使用父類型別的引用指向子類的物件;
二、該引用只能呼叫父類中定義的方法和變數;
三、如果子類中重寫了父類中的一個方法,那麼在呼叫這個方法的時候,將會呼叫子類中的這個方法;(動態連線、動態呼叫)
四、變數不能被重寫,”重寫“的概念只針對方法,如果在子類中重寫了父類中的變數,該引用呼叫這個變數時輸出的是父類中的變數值。
通俗理解:
父類型別的引用指向子類的物件。父類型別的引用只能呼叫自己的方法和變數,但是如果自己的方法被子類覆蓋了,那麼呼叫的就是子類的。子類中func1(int i)這個方法是子類獨有的,所以父類型別的引用用不了。 簡單的說,就是父親用自己的,如果兒子有和父親一樣的,就用兒子的。兒子獨有的,父親不能用 。
相關文章
- [短文速度-4] new子類是否會例項化父類
- Java 中建立子類物件會建立父類物件麼?Java物件
- Java中內部類的例項化Java
- 子父類中函式函式
- java中多型的理解——父類引用指向子類物件Java多型物件
- 鏈式-父類中返回子類物件物件
- Java子類和父類的初始化執行順序Java
- Java類初始化和例項化Java
- 子父類中成員變數變數
- 類的繼承_子類繼承父類繼承
- Java的類的例項化順序Java
- C# 繼承 子類(派生類) 父類(基類)C#繼承
- 如何理解Python3中的子類和父類?Python
- 關於CSS中的定位使用子絕父相(子類絕對位置和父類相對位置)CSS
- python中類的建立和例項化Python
- C#中類的建立和例項化C#
- Qt中MainWindow類例項QTAI
- java關於繼承父類,需要實現父類中的構造方法Java繼承構造方法
- java多型抽象類例項Java多型抽象
- Dart - 抽象類的例項化Dart抽象
- objective-c 通過類名例項化類Object
- Python中類建立和例項化過程Python
- 子類繼承父類(父類和子類裡:塊、靜態塊、構造和方法覆寫)之間呼叫順序繼承
- C++類將函式模板宣告為友元 例項C++函式
- 父類和子類的建構函式問題函式
- 父類和子類之間的轉換問題
- java內部類之成員內部類例項Java
- JVM初探(五):類的例項化JVM
- 波哥學JAVA,定義類 宣告屬性 建立物件 例項化物件 物件呼叫屬性或者方法Java物件
- java中String類常用方法的使用與例項Java
- Java中可以宣告一個類為Static嗎?Java
- Java超類與子類Java
- 類和例項
- 京東獲得jd商品分類API介面(父分類、根分類、子分類)API
- 子類重寫父類的方法@Override的快捷鍵IDE
- 子類繼承父類的建構函式(方法)嗎?繼承函式
- ruby中的類例項變數和例項的例項變數變數
- python類例項化如何實現Python