官术网_书友最值得收藏!

3.1.1 抽象類

如果一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類,既然沒有足夠的信息描述一個具體的對象,因此這是一種不能實例化的類。抽象類往往用來描述我們在對具體問題進行分析、設計中得出的抽象概念。比如,如果進行一個圖形編輯軟件的開發,在進行具體問題分析時,存在著圓、三角形這樣一些具體概念,它們是不同的,但是它們又都屬于“形狀”這樣一個概念,即分類的標準就是具有形狀,但形狀是一個非常抽象概念,它并不能生成特定的對象,這個“形狀類”就是一個抽象類。那么在Java語言中如何定義一個抽象類呢?

在Java語言中,用abstract關鍵字來修飾一個類時,這個類就是抽象類。一個抽象類只規定了其子類具有某種功能,并不規定子類中該功能是如何實現的,該功能的具體行為由子類負責實現。抽象類的抽象性是靠其中存在的抽象方法來體現的。當用abstract關鍵字來修飾一個方法時,該方法就是抽象方法。一個抽象方法只是聲明一個方法,沒有方法體(沒有方法的具體實現),抽象方法的聲明以分號結束。

定義一個抽象類的格式如下:

      abstract class AbstractClassName{
      …
      }

例如:

            public abstract class Shape{
                    public abstract double area();//抽象方法
                    public abstract double volume();//抽象方法
            }

上面的代碼完成了對Shape抽象類的定義,可見定義抽象類和普通類差別不大,只是必須用abstract來修飾類名。它可以擁有一個或多個抽象方法,也可以沒有定義抽象方法,但只要類中有一個方法被聲明為抽象方法,則該類必須為抽象類。

當一個類被定義成abstract類時,表示一個抽象的概念,它不能用new關鍵字實例化對象,例如,上面定義的Shape類就是一個抽象類,只有被繼承并在子類中重寫其抽象方法,它才有意義。除抽象方法外,抽象類可以擁有和普通類一樣的類成員。

特別提示:

不能用abstract修飾類的構造方法、靜態方法和私有(private)方法。

例3-1】 定義一個代表形狀的抽象類,并派生出圓柱體類和長方體類,計算底面半徑為“2”,高為“3”的圓柱體體積和長、寬、高分別為“3”,“2”,“4”的長方體體積。

            //定義一個形狀抽象類
            abstract class Shape{
                double radius,length,width,height;
                abstract double vol();            //求體積的抽象方法
                Shape(double r,double h){          //對半徑和高進行初始化的構造方法
                    radius = r;
                    height = h;
                }
                Shape(double l,double w,double h){   //對長寬高進行初始化的構造方法
                    length = l;
                    width = w;
                    height = h;
                }
            }
             /**
             * 圓柱體類
             */
            class Circle extends Shape{
                Circle(double r,double h){
                    super(r,h);
                }
                double vol(){                  //重寫父類抽象方法
                    return (3.1416*radius*radius*height);
                }
            }
             /**
             * 長方體類
             */
            class Rectangle extends Shape{
                Rectangle(double l,double w,double h){
                    super(l,w,h);
                }
                double vol(){                  //重寫父類抽象方法
                    return (length*width*height);
                }
            }
            /**
            * 體類
            */
            public class AbstractClassDemo{
               public static void main(String[] args) {
                    Circle c = new Circle(2,3);
                    Rectangle r = new Rectangle(3,2,4);
                    System.out.println("圓柱體體積 ="+c.vol());
                    System.out.println("長方體體積 ="+r.vol());
                }
            }

程序的運行結果如下:

            圓柱體體積=37.6992
            長方體體積=24.0

在【例3-1】中,定義了一個Shape抽象類,通過對各種具體的形狀(如長方體和圓柱體等)分析,發現它們都可以求體積,而它們都是形狀中的一種,從而將求體積的方法定義在形狀類中,而不具體實現它。該抽象類實際上提供了一個規范,每一個繼承它的子類都必須要遵守這個規范,而如何去完成這個規范是子類自己的事情。

【思考】abstract修飾的類一定有abstract修飾的方法嗎?

主站蜘蛛池模板: 灵寿县| 雷州市| 同德县| 西宁市| 奉节县| 牡丹江市| 晋宁县| 兴城市| 濮阳市| 梁平县| 财经| 靖江市| 阜阳市| 巩义市| 德州市| 江永县| 共和县| 谢通门县| 游戏| 宣化县| 石狮市| 凤凰县| 新密市| 建瓯市| 滁州市| 连云港市| 彭水| 牟定县| 开封市| 南康市| 安徽省| 定远县| 高碑店市| 个旧市| 郁南县| 南汇区| 阳江市| 秦皇岛市| 祥云县| 枣阳市| 沙洋县|