JAVA中的隱藏和覆蓋

隱藏指的是子類把父類的屬性或者方法隱藏了,即將子類強制轉換成父類後,調用的還是父類的屬性和方法,而覆蓋則指的是父類引用指向了子類對象,調用的時候會調用子類的具體方法。

(1) 變量只能被隱藏(包括靜態和非靜態),不能被覆蓋

(2) 可以用子類的靜態變量隱藏父類的靜態變量,也可以用子類的非靜態變量隱藏父類的靜態變量,也可以用非最終變量(final)隱藏父類中的最終變量

(3) 靜態方法(static)只能被隱藏,不能被覆蓋;

(4) 非靜態方法可以被覆蓋;

(5) 不能用子類的靜態方法隱藏父類中的非靜態方法,否則編譯會報錯;

(6) 不能用子類的非靜態方法覆蓋父類的靜態方法,否則編譯會報錯;

(7) 不能重寫父類中的最終方法(final)

(8) 抽象方法必須在具體類中被覆蓋;

實例:

SuperClass類:

package com.yilong.test.scjp;

public class SuperClass {

    public static int i = 1;

    public int j = 2;

    public final int k = 3;

    public static void method1() {

       System.out.println("SuperClass Method1");

    }

    public void method2() {

       System.out.println("SuperClass Method2");

    }

    public final void method3() {

       System.out.println("SuperClass Method3");

    }

}

SubClass類:

package com.yilong.test.scjp;

public class SubClass extends SuperClass {

    public static int i = 2;//無論是不是static,都能隱藏父類的變量i

    public static int j = 1;

    public final int k = 4;//無論是不是final,都能隱藏父類的變量k

    public static void method1() {

       System.out.println("SubClass Method1");

    }

    public void method2() {

       System.out.println("SubClass Method2");

    }

    //Cannot override the final method from SuperClass

    /*public final void method3() {

       System.out.println("SubClass Method3");

    }*/

    public static void main(String[] args) {

       SuperClass sc = new SubClass();

       System.out.println("i = " + sc.i);

       System.out.println("j = " + sc.j);

       System.out.println("k = " + sc.k);

       sc.method1();//靜態方法只能被隱藏

       sc.method2();

      

       SubClass subc = new SubClass();

       System.out.println("i = " + subc.i);

       System.out.println("j = " + subc.j);

       System.out.println("k = " + subc.k);

       subc.method1();

       subc.method2();

    }

}

打印結果:

i = 1
j = 2
k = 3
SuperClass Method1
SubClass Method2
i = 2
j = 1
k = 4
SubClass Method1
SubClass Method2

 

補充:子類重寫父類的方法時候,不能拋出與父類方法不同的異常。意味着:如果父類的方法拋出了異常,子類重寫該方法時沒有拋出異常是合法的;但是如果父類中的方法沒有拋出異常,而子類重寫該方法時拋出了異常,那麼就會編譯錯誤;另外,如果子類在重寫父類的方法的時候拋出的異常與父類方法中拋出的異常不一樣,那麼也是會編譯錯誤的,如父類方法中拋出的是InterruptedException,而子類重寫該方法時拋出的是Exception,那麼也會編譯錯誤。

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