class A
{
? ?public void func1()
? ?{
? ? ? System.out.println("A func1 is calling");
? ?}
? ?public void func2()
? ?{
? ? ? func1();
? ?}
}
class B extends A
{
? ?public void func1()
? ?{
? ? ? System.out.println("B fun1 is calling");
? ?}
}
class C
{
? ?public static void main(String [] args)
? ?{
? ? ? B b=new B();
? ? ? A a=b;
? ? ? callA(a);
? ? ? callA(new B());
? ?}
? ?public static void callA(A a)
? ?{
? ? ? a.func1();
? ? ? a.func2();
? ?}
}
運行結果:
D:\>javac C.java
D:\>java C
B fun1 is calling
B fun1 is calling
B fun1 is calling
B fun1 is calling
簡單來說,就是RTTI,動態類型判定,也就是
B b=new B();
A a=new B();
只要等號右邊類型是什么類型,而且已經覆蓋父類的方法,那么調用該方法時,會自動知道相應的B中的覆蓋方法。這是一定的,運行時多態。
==================================================
只對方法進行動態判定,屬性的取值看,等號左邊,也就是編譯時類型。
將A和B添加一個屬性,在索取值,看結果:
class A
{
? ?public String name = "A CLASS";
? ?public void func1()
? ?{
? ? ? System.out.println("A func1 is calling");
? ?}
? ?public void func2()
? ?{
? ? ? func1();
? ?}
}
class B extends A
{
? ?public String name = "B CLASS";
? ?public void func1()
? ?{
? ? ? System.out.println("B fun1 is calling");
? ?}
}
public class C
{
? ?public static void main(String [] args)
? ?{
? ? ? B b=new B();
? ? ? A a=b;
? ? ? callA(a);
? ? ? callA(new B());
? ? ?
? ? ?
? ? ? System.out.println(a.name);
? ? ? System.out.println(b.name);
? ? ? System.out.println(new B().name);
? ? ?
? ?}
? ?public static void callA(A a)
? ?{
? ? ? a.func1();
? ? ? a.func2();
? ?}
}
運行結果:
D:\>javac C.java
D:\>java C
B fun1 is calling
B fun1 is calling
B fun1 is calling
B fun1 is calling
A CLASS
B CLASS
B CLASS
posted on 2007-01-05 09:53
壞男孩 閱讀(792)
評論(0) 編輯 收藏 所屬分類:
java命令學習