談笑有鴻儒,往來無白丁

          在恰當的時間、地點以恰當的方式表達給恰當的人...  閱讀的時候請注意分類,佛曰我日里面是談笑文章,其他是各個分類的文章,積極的熱情投入到寫博的隊伍中來,支持blogjava做大做強!向dudu站長致敬>> > 我的微博敬請收聽
          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 壞男孩 閱讀(794) 評論(0)  編輯  收藏 所屬分類: java命令學習
          主站蜘蛛池模板: 临邑县| 巩留县| 泰和县| 外汇| 延川县| 万源市| 吉林省| 滕州市| 郧西县| 新野县| 甘谷县| 金山区| 塔河县| 颍上县| 杨浦区| 嘉荫县| 乌拉特后旗| 东城区| 蒙自县| 本溪| 洪雅县| 石门县| 孟津县| 沽源县| 淅川县| 石家庄市| 临夏县| 广宁县| 长阳| 陇南市| 敖汉旗| 沙坪坝区| 龙南县| 慈利县| 宕昌县| 灵武市| 三都| 安塞县| 宽城| 北川| 合水县|