隱藏指的是子類把父類的屬性或者方法隱藏了,即將子類強制轉換成父類後,調用的仍是父類的屬性和方法,而覆蓋則指的是父類引用指向了子類對象,調用的時候會調用子類的具體方法。ide
(1) 變量只能被隱藏(包括靜態和非靜態),不能被覆蓋post
(2) 能夠用子類的靜態變量隱藏父類的靜態變量,也能夠用子類的非靜態變量隱藏父類的靜態變量,也能夠用非最終變量(final)隱藏父類中的最終變量;spa
(3) 靜態方法(static)只能被隱藏,不能被覆蓋;對象
(4) 非靜態方法能夠被覆蓋;blog
(5) 不能用子類的靜態方法隱藏父類中的非靜態方法,不然編譯會報錯;io
(6) 不能用子類的非靜態方法覆蓋父類的靜態方法,不然編譯會報錯;編譯
(7) 不能重寫父類中的最終方法(final);class
(8) 抽象方法必須在具體類中被覆蓋;test
實例:變量
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,那麼也會編譯錯誤。