Java程式設計思想(2nd)學習筆記(7) (轉)
第2章 多型
一.再探向上轉型(upcasting)
將某個 reference視為一個“reference to base type“的動作,稱為向上轉型。
1. Upcasting後某個時,如果derived class中覆寫了該函式,則會呼叫derived class中的函式;否則,會呼叫base class中的函式。如
class First{
public void prt(){
System.out.println("First");
}
}
class Second extends First{
//(a)
public void prt(){
System.out.println("Second");
}
}
public class ExplicitStatic{
public static void main(String[] args){
First n = new Second();
n.prt();;
}
}
結果為Second。如果當Second class中的prt()函式註釋掉,將輸出First。
2. 向上轉型後只能呼叫base class中被derived class覆寫的函式。
/*
abstract class First{
int i = 122;
public void prt(){
System.out.println("First.i = " + i);
}
public abstract void prt(First f);
}
:namespace prefix = o ns = "urn:schemas--com::office" />
class Second extends First{
public void prt(){
System.out.println("Second.i = " + i);
}
public void prt(First i)
{
}
public void prt(int i)
{
}
}
public class ExplicitStatic{
public static void main(String[] args){
First n = new Second();
n.prt(2);;
}
}
*/
class First{
public void prt(){
System.out.println("First");
}
}
class Second extends First{
//(a)
public void prt(){
System.out.println("Second");
}
public void prt(int i){//(a)
System.out.println("Second.i = " + i);
}
}
public class ExplicitStatic{
public static void main(String[] args){
First n = new Second();
n.prt(3);
}
}
(a)處的函式只是Second class中的函式,所以不能透過n.prt(3)進行呼叫。
二.Abstract class和Abstract methods
1. 如果一個class中存在abstract class,則class也必須被宣告為abstract class。
2. abstract class不能被例項化。
3. 如果base class是一個abstract class,那麼derived class必須實現base class中所有的abstract methods;否則,derived class也必須被宣告為abstract class。
三.其它要點
1. 純粹繼承與擴充
純粹繼承:只有base class所建議的函式,才被derived class加以覆寫。
擴充:除了覆寫base class的函式,還實現了自己的函式
abstract class First{
public abstract void f();
public abstract void g();
}
//純粹繼承
class Second extends First{
public void f(){}
public void g(){}
}
//擴充
class Third extends First{
public void f(){}
public void g(){}
public void u(){}//base class不存在的函式
}
2. 向下轉型
1) 向下轉型時只能呼叫base class中被覆寫過的函式
2) 只有本來就為derived class時才能正確向下轉弄。
class First{
public void f(){}
public void g(){}
}
class Second extends First{
public void f(){}
public void g(){}
public void u(){}
public void v(){}
}
public class ExplicitStatic{
public static void main(String[] args){
First[] x = {new First(), new Second()};
x[0].f();
x[1].g();
//!x[1].u();class First中不存在函式u()
//((Second)x[0]).f();(a)
((Second)x[1]).u();
}
}
(a)處會丟擲ClassCastException異常。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-962949/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java程式設計思想(2nd)學習筆記(6) (轉)Java程式設計筆記
- Java程式設計思想(2nd)學習筆記(9)-2 (轉)Java程式設計筆記
- Java程式設計思想(2nd)學習筆記(8)-1 (轉)Java程式設計筆記
- Java程式設計思想(2nd)學習筆記(8)-2 (轉)Java程式設計筆記
- Java程式設計思想學習筆記1 - 內部類Java程式設計筆記
- 《java程式設計思想》筆記1Java程式設計筆記
- java 程式設計思想的學習筆記 - 第一章Java程式設計筆記
- Java程式設計思想學習筆記4 - 序列化技術Java程式設計筆記
- Java 程式設計思想筆記:Learn 10Java程式設計筆記
- Go學習筆記:關於Java、Python、Go程式設計思想的不同Go筆記JavaPython程式設計
- 《Java程式設計思想》筆記08——持有物件Java程式設計筆記物件
- 《Java程式設計思想》讀書筆記一Java程式設計筆記
- 讀書筆記-Java程式設計思想-03筆記Java程式設計
- 《Java程式設計思想》筆記07——內部類Java程式設計筆記
- 《Java程式設計思想》筆記8.多型Java程式設計筆記多型
- 《Windows 程式設計》學習筆記(五) (轉)Windows程式設計筆記
- 《Windows 程式設計》學習筆記(四) (轉)Windows程式設計筆記
- 《Windows 程式設計》學習筆記(三) (轉)Windows程式設計筆記
- C++程式設計思想筆記之四 (轉)C++程式設計筆記
- C++程式設計思想筆記之一 (轉)C++程式設計筆記
- C++程式設計思想筆記之三 (轉)C++程式設計筆記
- C++程式設計思想筆記之六 (轉)C++程式設計筆記
- C++程式設計思想筆記之二 (轉)C++程式設計筆記
- Java中的按位操作——Java程式設計思想筆記Java程式設計筆記
- Java學習筆記--網路程式設計SocketJava筆記程式設計
- Java程式設計思想讀書筆記一:併發Java程式設計筆記
- XML 程式設計思想: 學習物件後設資料(轉)XML程式設計物件
- Python學習筆記之 Python設計思想&設計原則Python筆記
- 黑馬程式設計師——Java學習筆記之⑦——“網路程式設計”程式設計師Java筆記
- <<軟體設計學習筆記>> (轉)筆記
- 重學Java設計模式-學習筆記(1)Java設計模式筆記
- 網路程式設計學習筆記程式設計筆記
- 系統程式設計學習筆記程式設計筆記
- Linux學習/TCP程式設計學習筆記LinuxTCP程式設計筆記
- 《圖解 Google V8》設計思想篇——學習筆記(一)圖解Go筆記
- Java設計模式學習筆記(一) 設計模式概述Java設計模式筆記
- Java併發程式設計學習筆記----執行緒池Java程式設計筆記執行緒
- 程式設計基礎·Java學習筆記·物件導向(下)程式設計Java筆記物件