Polymorphism

类别:Java 点击:0 评论:0 推荐:

l          Polymorphism

 

1.  class A{

2.    int x = 1;

3.    int y = 2;

4.    int f() { return x; }

5.    static char sf() { return ‘A’; }

6.  }

7.  class B extend A{

8.    int x = 3;  // shadowing

9.    int z = 4;

10.   int f() { return x; } // overriding

11.   static char sf() { return ‘B’;} //shadowing

12.   int g(){ int x = 1;  return (x+this.x); }

13. }

14. class Z extend A{ }

15. public class SCJP {

16.   pubilc static void main(String[] args){

17.     A a = new B();

18.     B b = new B();

19.     B bb = new Z();               //error

20.     System.out.println(a.f());     // 3

21.     System.out.println(a.g());    // error

22.     System.out.println(a.z);      // error

23.     System.out.println(a.x);      // 1

24.     System.out.println(a.y);      // 2

25.     System.out.println(a.sf());    // ‘A’

26.     System.out.println(b.x);      // 3

27.     System.out.println(b.sf());    // ‘B’
28. } }

Assignment

●  意思是superclass的reference var可以refer to所有subclass的instance。(指的是reference variable不是object,只要是subtype就可以)

●  如第17行。第19行會產生compile error,因class Z不是class B的subclass

Method Invocation

●  virtual mehhod invocation,建立在method overriding及polymorphic assignment上。

●  如第20行。第17行宣告一個class A的reference var “a”並refer to subclass B。

Compile-time and Run-time Type

●  compile-time type是reference var的type,run-time type是object的type。

●  第17行,compile-time時a是A type,runt-time時a是B type。

●  第21行compile err因為此時a為A type,需轉型為 ((B)a).g() 才可以被執行。

Overriding and Shadowing

●  instance method只能被overridden,而class method及field只能被shadowed。

●  overriding instance method才有所謂的compile time type及run time type。

●  shadowing class method / field 永遠只有一種type,就是reference var的type。

●  第23行x和第25行sf()是shadowing。要看reference var的type (A)。

●  第27行最好改為標準呼叫方式B.sf()。


来自:【 Garfield 的 SCJP 閱讀筆記 】

本文地址:http://com.8s8s.com/it/it14916.htm