在子類構造方法中必定要調用父類構造方法,能夠經過super指定調用父類的哪一個構造方法,若是沒有指定,在實例化子類時會自動調用父類的無參構造方法。java
class Test02 { Test02(){ System.out.println("父類的無參構造方法"); } } public class Test01 extends Test02 { Test01(int v){//自動調用父類的無參構造方法 System.out.println("子類的有參構造方法"); } Test01(){ System.out.println("子類的無參構造方法"); } public static void main(String[] args) { new Test01(5); new Test01(); } }
運行結果:
ide
class Test02 { Test02(int v){ System.out.println("父類的有參構造方法"); } } public class Test01 extends Test02 { Test01(int v){ super(v); System.out.println("子類的有參構造方法"); } Test01(){ super(7);//注掉該行Test01()處會飄紅 System.out.println("子類的無參構造方法"); } public static void main(String[] args) { new Test01(5); new Test01(); } }
public class Test01 { private int id; Test01(){ System.out.println("無參構造方法"); this.method(); } Test01(int a,int b){ this(a); System.out.println("有參構造方法2:"+a+","+b); } Test01(int id){ this(); this.id = id; System.out.println("有參構造方法1:"+id); } public void method(){ System.out.println("方法1"); } public static void main(String[] args) { new Test01(10,20); } }
運行結果:
this
class Test02{ public final void method(){//final修飾,代表該方法爲最終方法,不能夠被覆蓋重寫 System.out.println("final修飾的方法"); } } public class Test01 extends Test02 { final int ID = 10; int num = 9; // public void method(){//會報錯:'method()'不能覆蓋'review.Test02' 中的 'method()';重寫方法是 final // // } public static void main(String[] args) { // new Test01().id = 100;//報錯:沒法爲 final 變量 'id' 賦值 System.out.println(new Test01().num);//9 } }
abstract class Test02{ public abstract void method(); public void method2(){ this.method();//此處的this表明的是繼承該類的類,而不是該類自己 System.out.println("抽象類內部能夠有普通方法"); } } public class Test01 extends Test02 { @Override public void method() { System.out.println("實現抽象類的抽象方法"); } public static void main(String[] args) { Test02 test02 = new Test01(); test02.method(); System.out.println("==========="); test02.method2(); } }
運行結果:
.net
class Test02 { Test02(int v){ System.out.println("父類的有參構造方法"); } } public class Test01 extends Test02 { static class Inner{ Inner(int v){ System.out.println("靜態內部類的構造方法"); } } class Inner2{ Inner2(int c){ System.out.println("普通內部類的構造方法"); } } static int id; Test01(){ super(7); System.out.println("子類的無參構造方法"); } static void mathod(){ System.out.println("子類的靜態方法"); } public static void main(String[] args) { int a = Test01.id; Test01.mathod(); System.out.println("===========華麗的分割線==========="); Test01 test = new Test01(); int b = test.id;//合法但不推薦 test.mathod();//合法但不推薦 System.out.println("===========華麗的分割線==========="); Test01.Inner2 inner2 = new Test01().new Inner2(1);//普通內部類的調用 Test01.Inner inner = new Test01.Inner(4);//靜態內部類的調用 } }
運行結果:
補充:3d
class Test1004{ public static Test1004 a = new Test1004(); public static Test1004 b = new Test1004(); { System.out.println("構造代碼塊"); } static{ System.out.println("靜態代碼塊"); } } public class StaticDemo { public static void main(String[] args) { Test1004 t = new Test1004(); } }
運行結果:
code
訪問限定符 | 類內部 | 同一包的其餘類 | 其餘包的子類 | 其餘包的其餘類 |
---|---|---|---|---|
private | Y | N | N | N |
default | Y | Y | N | N |
protested | Y | Y | Y | N |
public | Y | Y | Y | Y |