Java程式設計思想(2nd)學習筆記(7) (轉)

worldblog發表於2007-08-17
Java程式設計思想(2nd)學習筆記(7) (轉)[@more@]

第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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章