1. 程式人生 > >Java抽象類和介面(一)

Java抽象類和介面(一)

**********************第九章 抽象類和介面**************************

 

**************************抽象類**************************


一.why 什麼時候想到使用抽象類


需求: 矩形、三角形、圓形


方法:

1. 求周長

2. 求面積

3. 說出我有幾條邊


4. 簡單的介紹我自己

列印: 我是一個圖形

 

原因1:

矩形、三角形、圓形(都有以上4個相同的方法),當多個類中有相同的屬性和方法時,

應該把這些屬性和方法提取出來,放到一個父類中(Graph 圖形類),其他類(矩形、三角形、圓形)繼承繼承類,來複用圖形類的程式碼..這是我們以前學過的繼承..

但是我們發現 當求周長、求面積、說出我有幾條邊這幾個方法 抽到圖形類時,圖形類

無法準確實現這3個方法或者說實現起來沒有意義,這樣需要把這三個方法定義成抽象

方法...(沒有方法體的方法 或沒有實現的方法)..一個類中一旦有一個方法定義成抽象
的,這個類一定要是抽象類...


原因2:

當子類中 對父類繼承下來的方法(求周長) 有各自不同的實現的時候,需要使用抽象類

 

二.what 什麼是抽象類


簡單的定義(不太準確): 含有抽象方法的類 叫做抽象類..

抽象方法: 沒有方法體的方法叫做抽象方法


例如:

public abstract int getLength();//抽象方法


注意:

public abstract int getLength(){

}

不是抽象方法,抽象方法 沒有方法體 沒有實現,像上面的程式碼叫做空實現..

(即實現了 但什麼也沒做)


抽象類是軟體設計中的半成品:

1. 有一半是已經完成的

簡單介紹一下我自己這個方法 已經實現了 列印我是一個圖形


2. 有一半是沒有完成的,需要子類去實現它

求周長、求面積、說出我有幾條邊


三.how 如何定義抽象

需要使用abstract 關鍵字 修飾類,這個類叫做抽象類


演示程式碼:

package com.chapter9.演示抽象類;

/**
* 作者: zhangzy
* 公司: 藍橋軟體學院
* 時間: 2017年7月7日 上午9:30:42
* 功能: 演示抽象類
* 抽象類 : 軟體設計中的半成品
*/
public abstract class Graph {

//1.求周長
public abstract int getLength();

//2.求面積
public abstract int getArea();

//3.說出我有幾條邊
public abstract void sayYouJiTiaoBian();

//4.簡單的介紹一下我自己
public void simpleIntroduce(){
System.out.println("我是一個圖形");
}

public static void main(String[] args) {
//Graph g = new Graph();

}

}


矩形

package com.chapter9.演示抽象類;


public class Rectangle extends Graph{

private int width;
private int height;

public Rectangle(){

}

public Rectangle(int width,int height){
this.width = width;
this.height = height;
}


@Override
public int getLength() {

return 2 * (width + height);
}

@Override
public int getArea() {
return height * width;
}

@Override
public void sayYouJiTiaoBian() {
System.out.println("我是矩形,我有四條邊");
}

public static void main(String[] args) {
Rectangle rectangle = new Rectangle(10,30);

int length = rectangle.getLength();

System.out.println(length);
}

}

 

*************************抽象類的若干知識點****************************

1. 抽象類不能夠建立物件

因為它是軟體設計中的半成品


2. 子類繼承抽象類,子類如果想建立物件,必須要重寫抽象類的所有抽象方法,

除非子類也是抽象類


**************************************幾個小的面試題*************************


1. 抽象方法能使用private來修飾嗎?


不可以. 因為抽象方法 是需要子類去繼承然後重寫它,而private修飾的方法不能被繼承 二者矛盾

 

2. 抽象類可以沒有抽象方法嗎???


抽象類可以不包含抽象方法的, 我就是認為這個類是軟體設計中的半成品 所以把它定義成抽象類


3. 抽象方法可以定義成靜態的嗎???


不可以. 因為靜態方法 是使用類名呼叫的 類名.方法名() 呼叫該方法 並沒有做任何事 沒有意義

所以抽象方法不能定義成靜態的...


4. 抽象方法可以使用final 修飾嗎??


不能. final 最終方法 不能被重寫 而抽象方法 是需要子類去重寫,二者矛盾


5. 抽象類可以使用 final 修飾嗎??


不能. final 修飾的類 是最終類 不能被繼承 ,而抽象類 需要子類去繼承的...二者矛盾

 

************************************可以修飾類的修飾符******************************


1. 訪問控制權限修飾符

public或預設許可權

2. 其他

abstract 或 final

strictfp 如果該類用於科學計算 對數值的精度要求比較高 需要使用strictfp 來修飾