隨筆-208  評論-469  文章-30  trackbacks-0

          abstract修飾符可用來修飾類和實例成員方法

          用abstract修飾的類表示抽象類,抽象類不能被實例化。沒有用abstract修飾的類稱為具體類,具體類可以被實例化。

          用abstract修飾的方法表示抽象方法,抽象方法沒有方法體。抽象方法用來描述系統具有什么功能,但不提供具體的實現。沒有用abstract修飾的方法稱為具體方法,具體方法必須要有方法體。

          使用abstract修飾符需要遵守以下語法規則:

          ??? (1)抽象類中可以沒有抽象方法,但包含了抽象方法的類必須被定義為抽象類。如果子類沒有實現父類中所有的抽象方法,那么子類也必須被定義為抽象類,否則編譯出錯。

          ??? (2)沒有抽象構造方法,也沒有抽象靜態方法。
          ??? abstract class Base {
          ?????? abstract Base() {}?????????????? //編譯出錯,構造方法不能是抽象的
          ?????? static abstract void method1();? //編譯出錯,static和abstract修飾符不能連用
          ?????? static void method2() {...}????? //合法,抽象類中可以有靜態方法
          ??? }

          ??? (3)抽象類中可以有非抽象的構造方法,創建子類的實例時可能會調用這些構造方法。抽象類不能被實例化,然而可以創建一個引用變量,其類型是一個抽象類,并讓它引用非抽象的子類的一個實例。

          ??? (4)抽象類及抽象方法不能被final修飾符修飾。即,abstract與final不能連用。這是因為abstract與final的作用是恰恰相反的,如:抽象類只允許創建其子類,而final修飾的類不允許擁有子類; 抽象方法必須被子類的具體方法來實現,而final修飾的方法不允許被子類方法覆蓋。

          為什么抽象類不允許被實例化?

          在語義上,抽象類表示從一些具體類中抽象出來的類型。從具體類到抽象類,這是一種更高層次的抽象。如:蘋果類、香蕉類和桔子類是具體類,而水果類則是抽象類,在自然界并不存在水果類本身的實例,而只存在它的具體子類的實例。
          ??????????? Fruit fruit = new Apple(); //創建一個蘋果對象,把它看做是水果對象
          在語法上,抽象類中可以包含抽象方法,如果抽象類可以實例化,那么在訪問抽象方法時將無法執行,因為抽象方法中根本就沒有方法體。由此可見,Java編譯器不允許創建抽象類的實例是必要的。
          ???????????? abstract class Base {
          ??????????????? public void method1() {...}?????? //具體方法
          ??????????????? public abstract void method2();?? //抽象方法
          ???????????? }???

          ???????????? Base base = new Base();? //假定Java編譯器沒有報錯
          ???????????? base.method1();
          ???????????? base.method1();????????? //運行時Java虛擬機無法執行這個方法

          posted on 2006-11-29 00:46 EricWong 閱讀(596) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 石家庄市| 石狮市| 灵武市| 离岛区| 武城县| 甘德县| 鲁甸县| 金川县| 金塔县| 泸溪县| 闽清县| 兰溪市| 洪洞县| 边坝县| 濮阳市| 邹平县| 尼木县| 嘉鱼县| 睢宁县| 红桥区| 中方县| 伊吾县| 平顶山市| 青铜峡市| 宜昌市| 宁河县| 徐州市| 来宾市| 姚安县| 顺平县| 章丘市| 习水县| 普安县| 神木县| 天津市| 涿鹿县| 收藏| 武定县| 盐津县| 武胜县| 黎川县|