繼承是一種由己有的類建立新類的機制.利用繼承,能夠先建立一個共有屬性的通常類,根據該通常類再建立具備特殊屬性的新類,新類繼承通常類的狀態
和行爲,並根據須要增長它本身的新的狀態和行爲.由繼承而獲得的類稱爲子類,被繼承的類稱爲父親.java不支持多重繼承.java
所謂子類繼承父類的成員變量做爲本身的一個成員變量,就好像它們是在子類中直接聲明同樣,能夠被子類中本身聲明的任何實例方法操做,也就是說,一
個子類繼承的成員應當是這個類的徹底意義的成員,若是子類中聲明的實例方法不能操做父類的某個成員變量,該成員變量就沒有被子類繼承;所謂子類
繼承父類的方法做爲子類中的一個方法,就象它們在子類中直接聲明同樣,能夠被子類中本身聲明的任何實例方法調用.ide
若是子類和父類在同一包中,那麼子類天然地繼承了其父類中不是private的成員變量做爲本身的成員變量,並天然地繼承了其父類中不是private的成
員方法做爲本身的成員方法,繼承的成員的訪問權限保持不變. 例如:this
package c07.pa; public class Super { public int i = 0; protected int j = 0; int m = 0; private int n = 0; public void method_i() { System.out.println("super public"); } protected void method_j() { System.out.println("super protected"); } void method_m() { System.out.println("super default "); } private void method_n() { System.out.println("super private"); } } package c07.pa; /** * 同一個包下進行繼承,其子類的屬性以及方法的權限不變,均與父類的權限一致 */ public class Sub1 extends Super { public void test() { System.out.println(this.i);// i 爲 public System.out.println(this.j);// j 爲 protectd System.out.println(this.m);// m 爲defult // System.out.println(this.n); // n 爲private this.method_i();// method_i 爲 public this.method_j();// method_j 爲 protected this.method_m();// method_m 爲 default // this.method_n(); method_n 爲private } }
若是子類和父類不在同一個包中,那麼,子類能夠繼承父類的public,protected成員變量和成員方法做爲子類的成員變量和方法,繼承的
成員或方法的訪問權限保持不變.
示例以下:code
package c07.pa; public class Super { public int i = 0; protected int j = 0; int m = 0; private int n = 0; public void method_i() { System.out.println("super public"); } protected void method_j() { System.out.println("super protected"); } void method_m() { System.out.println("super default "); } private void method_n() { System.out.println("super private"); } } package c07.pb; import c07.pa.Super; /** * 子類不與父類在同一個包下,只能繼承public proteced的屬性和方法 繼承後子類的屬性和方法的權限都沒有發生改變 * 因此繼承是不會引發方法或屬性的權限改變的 簡單點:繼承不引發權限變化 */ public class Sub1 extends Super { public void test() { System.out.println(this.i);// i 爲 public System.out.println(this.j);// j 爲 protectd // System.out.println(this.m);// m 爲defult 不能夠繼承 // System.out.println(this.n); // n 爲private 不能夠繼承 this.method_i();// method_i 爲 public this.method_j();// method_j 爲 protected // this.method_m();// method_m 爲 default 不能夠繼承 // this.method_n(); method_n 爲private 不能夠繼承 } }
子類重寫父類方法時,不能夠將權限更改成小於父類方法的權限,也就是重寫父類方法時,權限必須大於等於父類方法的權限
子類覆蓋父類屬性時,由於不存在重寫的問題,因此覆蓋屬性時子類的權限能夠隨意了。
見下面的例子:繼承
package c07.pa; public class Super { public int i = 0; protected int j = 0; int m = 0; private int n = 0; public void method_i() { System.out.println("super public"); } protected void method_j() { System.out.println("super protected"); } void method_m() { System.out.println("super default "); } private void method_n() { System.out.println("super private"); } } package c07.pb; import c07.pa.Super; /** * 子類不與父類在同一個包下,只能繼承public proteced的屬性和方法 * 繼承後子類的屬性和方法的權限都沒有發生改變 * 因此繼承是不會引發方法或屬性的權限改變的 * 簡單點:繼承不引發權限變化 */ public class Sub1 extends Super { //屬性不存在重寫,因此可使用隨意的權限並定義新的屬性去覆蓋父類的屬性 private int i = 1; /* * 父類的權限爲public 子類重寫的不能夠低於public * Multiple markers at this line - overrides c07.pa.Super.method_i - Cannot reduce the visibility of the inherited method from Super @Override protected void method_i() { super.method_i(); } */ /** * 父類的這個方法的權限爲protected 則子類的權限不能夠低於protected private void method_j() { super.method_j(); } */ }
author zhaob
time : 2014-09-15 20:25ip