国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

構造函數的繼承問題

2019-11-18 15:06:03
字體:
來源:轉載
供稿:網友

  構造函數的繼續問題(靜水流深第一版)

這是我的讀書筆記,希望能夠對大家學習java有所幫助。
所有代碼都經過測試,測試環境:
java version "1.4.0-rc"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-rc-b91)
Java HotSpot(TM) Client VM (build 1.4.0-rc-b91, mixed mode)
如大家發現任何錯誤,或有任何意見請不吝賜教。

缺省構造函數的問題:base類是父類,derived類是子類,首先要
說明的是由于先有父類后有子類,所以生成子類之前要首先有父類。
class是由class的構造函數constrUCtor產生的,每一個class都有
構造函數,假如你在編寫自己的class時沒有編寫任何構造函數,那么
編譯器為你自動產生一個缺省default構造函數。這個default構造函數
實質是空的,其中不包含任何代碼。但是一牽扯到繼續,它的問題就出現
了。

假如父類base class只有缺省構造函數,也就是編譯器自動為你產生的。
而子類中也只有缺省構造函數,那么不會產生任何問題,因為當你試圖產生
一個子類的實例時,首先要執行子類的構造函數,但是由于子類繼續父類,
所以子類的缺省構造函數自動調用父類的缺省構造函數。先產生父類的實例,
然后再產生子類的實例。如下:

class base{
}
class derived extends base{
public static void main(String[] args){
derived d=new derived();
}
}

下面我自己顯式地加上了缺省構造函數:
class base{
base(){
System.out.}
}
class derived extends base{
derived(){
System.out.println("derived constructor");
}
public static void main(String[] args){
derived d=new derived();
}
}

執行結果如下:說明了先產生base class然后是derived class。
base constructor
derived constructor

我要說明的問題出在假如base class有多個constructor
而derived class也有多個constructor,這時子類中的構造函數缺省
調用那個父類的構造函數呢?答案是調用父類的缺省構造函數。
但是不是編譯器自動為你生成的那個缺省構造函數而是你自己顯式地
寫出來的缺省構造函數。

class base{
base(){
System.out.println("base constructor");
}
base(int i){
System.out.println("base constructor int i");
}
}
class derived extends base{
derived(){
System.out.println("derived constructor");
}
derived(int i){
System.out.println("derived constructor int i");
}
public static void main(String[] args){
derived d=new derived();
derived t=new derived(9);
}
}

D:java hinking hink6>java derived
base constructor
derived constructor
base constructor
derived constructor int i

假如將base 類的構造函數注釋掉,則出錯。

class base{
// base(){
// System.out.println("base constructor");
// }
base(int i){
System.out.println("base constructor int i");
}
}
class derived extends base{
derived(){
System.out.println("derived constructor");
}
derived(int i){
System.out.println("derived constructor int i");
}
public static void main(String[] args){
derived d=new derived();
derived t=new derived(9);
}
}

D:java hinking hink6>javac derived.java
derived.java:10: cannot resolve symbol
symbol : constructor base ()
location: class base
derived(){
^
derived.java:13: cannot resolve symbol
symbol : constructor base ()
location: class base
derived(int i){
^
2 errors

說明子類中的構造函數找不到顯式寫出的父類中的缺省
構造函數,所以出錯。

那么假如你不想子類的構造函數調用你顯式寫出的父類中的缺省
構造函數怎么辦呢?
如下例:

class base{
// base(){
// System.out.println("base constructor");
// }
base(int i){
System.out.println("base constructor int i");
}
}
class derived extends base{
derived(){
super(8);
System.out.println("derived constructor");
}
derived(int i){
super(i);
System.out.println("derived constructor int i");
}
public static void main(String[] args){
derived d=new derived();
derived t=new derived(9);
}
}

D:java hinking hink6>java derived
base constructor int i
derived constructor
base constructor int i
derived constructor int i

super(i)表示父類的構造函數base(i)請大家注重
一個是super(i)一個是super(8)。
大家想想是為什么??

結論:子類假如有多個構造函數的時候,父類要么沒有構造函數,
讓編譯器自動產生,那么在執行子類構造函數之前先執行編
譯器自動產生的父類的缺省構造函數;要么至少要有一個顯
式的缺省構造函數可以讓子類的構造函數調用。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 蒲城县| 新蔡县| 绥中县| 佛坪县| 泌阳县| 门源| 万源市| 潼关县| 淳安县| 扎兰屯市| 交城县| 房山区| 辉县市| 大石桥市| 东辽县| 浦北县| 独山县| 达日县| 玉龙| 珲春市| 黔东| 耿马| 称多县| 邵武市| 阳山县| 临泉县| 麻栗坡县| 潜江市| 呼图壁县| 威远县| 鞍山市| 涞水县| 雷波县| 枣庄市| 邵阳县| 永州市| 固阳县| 东乌珠穆沁旗| 富裕县| 奎屯市| 莱州市|