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();
? ?}
}
運(yùn)行結(jié)果:
D:\>javac C.java
D:\>java C
B fun1 is calling
B fun1 is calling
B fun1 is calling
B fun1 is calling
簡(jiǎn)單來(lái)說(shuō),就是RTTI,動(dòng)態(tài)類型判定,也就是
B b=new B();
A a=new B();
只要等號(hào)右邊類型是什么類型,而且已經(jīng)覆蓋父類的方法,那么調(diào)用該方法時(shí),會(huì)自動(dòng)知道相應(yīng)的B中的覆蓋方法。這是一定的,運(yùn)行時(shí)多態(tài)。
==================================================
只對(duì)方法進(jìn)行動(dòng)態(tài)判定,屬性的取值看,等號(hào)左邊,也就是編譯時(shí)類型。
將A和B添加一個(gè)屬性,在索取值,看結(jié)果:
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();
? ?}
}
運(yùn)行結(jié)果:
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
壞男孩 閱讀(794)
評(píng)論(0) 編輯 收藏 所屬分類:
java命令學(xué)習(xí)