關於JAVA多態的一些筆記

1、在進行多態調用對象時,如:

class A
{
     int i=99;
       public void run()
   {

   }
 }
    class B extends A

{
        int i=1;
 }

  public static void main(String [] args)
{
          A a=new B();
          System.out.println(a.i);
 }

此時輸出的屬性i的值應該是99。因爲在JAVA中屬性沒有覆蓋之說,只有隱藏。而此時,a的值就是A類對象。因此調用ia.i輸出的自然是99.

當然,當第17行改成 B b=new B();的時候,輸出的就會是B類中的值1。

2、在多態當中,一個子類繼承父類的時候,子類就會將父類中的所有方法繼承下來,也就是說,子類(還是上面的 A,B類)B中方法run還是有的,而且 new B的時候,同樣會給run 方法分配空間;

  但是屬性就不同,儘管子類會隱藏父類的屬性,(B中也新建了一個i 但是父類A中的並不是不存在了,這個i同樣會在new B的時候分配一個給父類的i。也就是說,但新建一個B的實例的時候,會有兩個i,想要調用父類的i就得通過關鍵字 super.

 這裏可以理解成,父類的i其實是在子類中的,但是爲了區分開來,就必須用super關鍵字。

3、進行覆蓋的時候,程序看到的是子類最新覆蓋的程序。

class A
{

    public A()
    {
       m1();
    }
     int i=99;
     public void m1()
     {
         System.out.println("Show in A");
     }
       public void run()
   {

   }
 }
    class B extends A

{
        int i=1;
 }

@Override
   public void m1()
   {
      System.out.println("Show in B");
   }

  public static void main(String [] args)
{
          A a=new B();
          System.out.println(a.i);
          a.m1();
 }

如上面的這個代碼,問這個代碼的輸出結果是什麼?
結果是
Show in B
99
Show in B
———————-
爲什麼會出現這個結果呢?
雖然新建一個B的對象的時候A的構造方法會啓用,該構造方法會調用方法m1( )
但是在後面的子類B當中,對m1( ) 的方法進行了覆蓋,因此程序就只能見到最新覆蓋的方法了、

4、子類如果向上轉換了,如 A a =new B(); 這個時候a就不能調用B中的新增屬性或方法。

後記:以上內容都是今天課堂的內容,我已經好幾節課沒去上了,自以爲老師講的我已經會了,事實上,有很多實驗室那天討論會討論的內容老師輕易的解決了。
以後還是要多去聽聽課的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章