不會還有人不知道Java的抽象類吧?不會吧不會吧

在 Java 中抽象類的語法格式如下:

<abstract>class<class_name> {
    <abstract><type><method_name>(parameter-iist);
}

其中,abstract 表示該類或該方法是抽象的;class_name 表示抽象類的名稱;method_name 表示抽象方法名稱,parameter-list 表示方法參數列表。

抽象方法沒有方法體
抽象方法必須存在於抽象類中
子類重寫父類時,必須重寫父類所有的抽象方法。
抽象類和抽象方法都要使用 abstract 關鍵字聲明。
抽象類不能實例化,也就是不能使用 new 關鍵字創建對象。(其實是可以的,只不過沒意義,例子裏就是這樣寫的)

例子:使用長方形類繼承了形狀類,又用菱形繼承了長方形類,尋思寫複雜點,多練幾遍

package test;

public class Abstract {

    //定義形狀抽象類
    public abstract class Shape {
        public int width;   // 長度
        public int height; // 高度,不是寬度。

        public Shape(int width, int height) {
            this.width = width;
            this.height = height;
        }
        // 定義抽象方法,計算面積area,定義抽象類周長length
        public abstract double area(); 
    }
    
    //又定義抽象長方形類,繼承形狀類
    public abstract class Square extends Shape{ 
        public Square (int width,int height){
            super(width, height );
        }

        @Override
        public double area() {  //重寫父類抽象方法
            return width*height;
        }
        public abstract double length();
    }

    //定義菱形類,繼承長方形類
    public class Diamond extends Square{
        public Diamond(int width,int height){
            super(width, height );
        }

        @Override
        public double area() {
            return width*height*0.5;
        }
        @Override
        public double length() {
            return width*2+height*2; //公式貌似不對,但不要在意這些細節哈哈
        }

    }
    public  static void main(String args[]){
        Abstract.Diamond d =new Abstract ().new Diamond (1,3);//長方形的
        System.out.println ( d.area () );
        System.out.println ( d.length () );

        Abstract.Square s =new Abstract ().new Square (2,4) { //菱形的
            @Override
            public double length() {
                return width*2+height*2;
            }
        };
        System.out.println ( s.area() );
        System.out.println ( s.length () );
    }
}

輸出如下:

1.5
8.0
12.0

之前main方法我是這麼寫的:

public  static void main(String args[]){
      Diamond d =new Diamond (1,3);//長方形的
        System.out.println ( d.area () );
        System.out.println ( d.length () );
}

然後報錯:
Error:(49, 20) java: /D:/Abstract.java:49: 無法從靜態上下文中引用非靜態變量 this

問題在於我把 class Diamond 放到了 public class Abstract 內部,導致Diamond 成了Abstract 的非靜態內部類,屬於Abstract 的一個成員,在靜態方法main中不能訪問非靜態的成員,也就不能直接new Diamond(),只能通過外部類的對象訪問,like this:
Abstract.Diamond d =new Abstract ().new Diamond (1,3);

注意:在使用 abstract 關鍵字修飾抽象方法時不能使用 private 修飾,因爲抽象方法必須被子類重寫,而如果使用了 private 聲明,則子類是無法重寫的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章