java的構造函數是一個非常重要的作用,首先java里的構造函數是可以重載的,而且因為也是可以繼承在父類的構造函數,所以在子類里,首先必然是調用父類的構造函數。可以看下面的兩個例子來對比:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
public class Test { public static void main(String args[]) { B b = new B( 100 ); } } class A { public A() { System.out.println( "A without any parameter" ); } public A( int i) { System.out.println( "A with a parameter" ); } } class B extends A { public B() { System.out.println( "B without any parameter" ); } public B( int i) { System.out.println( "B with a parameter" ); } } |
這個例子最后輸出的是
A without any parameter
B with a parameter
可以看到首先調用的是父類的構造函數,然后再是調用自己的構造函數。但是因為這里的B類中的有參數的構造函數是沒有super父類,所以導致它只會執行父類的沒有參數的構造函數。如果要讓它執行有參數的父類的構造函數,那么就要這樣寫代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
public class Test { public static void main(String args[]) { B b = new B( 100 ); } } class A { public A() { System.out.println( "A without any parameter" ); } public A( int i) { System.out.println( "A with a parameter" ); } } class B extends A { public B() { System.out.println( "B without any parameter" ); } public B( int i) { super (i); //這里就是繼承自父類的有參數的構造函數 System.out.println( "B with a parameter" ); } } |
所以最后輸出的是:
A with a parameter
B with a parameter
因此,派生類必須通過super來調用父類的含有參數的構造函數。以下再附一道題:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
public class Test extends X { Y y = new Y(); Test() { System.out.print( "Z" ); } public static void main(String args[]) { new Test(); } } class X { Y b = new Y(); X() { System.out.print( "X" ); } } class Y { Y() { System.out.print( "Y" ); } } |
輸出的結果是什么?
首先我們來分析這道題:
因為首先看這個main函數,這個main函數只有一句代碼: new Test();因為發現這個Test類是繼承自X,所以首先要構造X,那么就進行X類的運行 Y b = new Y(),然后我們可以看到輸出的Y,然后就是執行X類的構造函數,輸出X;接著就是構造Y,然后執行Test自己的構造函數,輸出Z,所以輸出結果是YXYZ。
以上這篇關于java中構造函數的一些知識詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。