1. 程式人生 > >JAVA的修飾詞(3)----abstract 抽象類

JAVA的修飾詞(3)----abstract 抽象類

1.引入概念:

狼和狗,兩個類,抽取他們所屬的共性:犬科。
犬科都有吼叫行為,具體是汪汪汪還是嗷嗷嗷,是不確定的,需要子類明確。
這些犬科不具體的功能,需要在類中標識出來,通過java中的關鍵字abstract(抽象)
定義了抽象函式的類也要被abstract修飾,即抽象類。
用法和繼承類似。
舉例:

abstract class 犬科(){
    abstract void 叫();
    //用abstract修飾抽象函式
}

class Dog extends 犬科{
    void 叫(){
        System.out.println("汪汪汪");
    }   
}

class
Wolf extends 犬科{
void 叫(){ System.out.println("嗷嗷嗷"); } }

2.抽象類的特點

1)抽象類和抽象方法都需要被abstract修飾。抽象方法一定定義在抽象類中。
2)抽象類不可以建立例項,因為呼叫抽象方法是沒有意義的。
3)只有覆蓋了抽象類的所有抽象方法後子類才可以例項化,否則這個子類還是一個抽象類。

3.抽象類的常見問題

1)抽象類一定是父類嗎?
答:
是的,因為抽象類是不斷抽取而來的

2)抽象類有建構函式嗎?
答:
有的,雖然能不能給自己的物件初始化,但是可以給自己的子類初始化。

3)抽象類和一般類有什麼不同?
答:
抽象類和一般類都是用來描述事物的,並且都可以定義屬性和功能,但是:
一般類可以描述具體的描述事物,可以建立物件;
抽象類描述事物的資訊不具體,不能建立物件,能夠定義抽象函式。

4)抽象類裡一定要定義抽象方法嗎?
答:
不一定,抽象類的另一個作用就是可以利用抽象類的特性使該類不能建立物件

5)abstract不能哪些關鍵字一起用?
答:
1 final :最終不能更改,抽象肯定得定義抽象方法
2 private :明顯….你都私有了不讓別人用還抽象幹嘛
3 static : 靜態直接能被類名呼叫,對抽象類來說是沒有意義的

4.抽象類簡單應用

需求:

公司中程式設計師有姓名,工號,薪水,工作內容
專案經理有姓名,工號,薪水,工作內容,獎金 進行建模。

解決步驟:
1)尋找涉及的物件

程式設計師:
    屬性:姓名,工號,薪水
    行為:工作內容 
專案經理:
    屬性:姓名,工號,薪水,獎金
    行為:工作內容

兩個物件具有共性,沒有子父類關係。將他們的共性抽取,共同型別:worker

員工:
    屬性:姓名,工號,薪水
    行為:工作內容 

員工的工作內容是不具體的,所以是抽象的,應該由子類實現
可以寫出員工類:

abstract class Worker{
    private String name;
    private String id;
    private double pay;

    // 建構函式,員工的3個屬性
    public worker(String name,String id,double pay){
        this.name = name;
        this.id = id;
        this.pay = pay;
    }

    // 抽象行為:工作
    public abstract void work();
}

寫出子類:程式設計師

class Programmer extends Worker{
    // 建構函式
    public programmer(String name,String id,double pay){
        // 引用父類
        super(name,id,pay);
    }

    // 工作行為:程式碼
    public void work(){
        System.out.println("I'm coding");
    }
}

寫出子類:經理

class Manager extends Worker{
    // 特有屬性:獎金
    private double bonus;
    // 建構函式,經理屬性
    public Manager(String name,String id,double pay,double bonus){
        super(name,id,pay);
        this.bonus = bonus;
    }
    // 工作行為:管理
    public void work(){
        System.out.println("I'm manageing");
    }
}

5.補充

對於上面3.4問題,舉例說明

有一個介面

interface Inter{
    public void show1();
    public void show2();
    public void show3();
}   

現在需要分別單獨使用show1和show2

//使用1方法
class InterDemo1 implements Inter{
    public void show1(){
        xxxx;
    }
    // 如果不覆蓋其他方法,這就是一個抽象類
    // 所以需要寫,即使用不到
    public void show2(){}
    public void show3(){}
}

//同上,使用2
class InterDemo2 implements Inter{
    public void show2(){
        xxxx;
    }
    public void show1(){}
    public void show3(){}
}

這樣做的話很費勁,複用性差
所以可以設定一個類,把四個方法覆蓋,再讓子類繼承

class InterImpl implements Inter{
    public void show1();
    public void show2();
    public void show3();
}
// 繼承InterImpl中的方法,直接使用show1就行了,簡化了很多
class InterDemo1 extends InterImpl{
    public void show1(){
        xxxx;
    }
}
// 同上,使用show2
class InterDemo1 extends InterImpl{
    public void show2(){
        xxxx;
    }
}

可是這樣做又出現問題了,這個InterImpl類 建立物件是沒有意義的,所以令其抽象化。

// 抽象化
abstract class InterImpl implements Inter{
    public void show1();
    public void show2();
    public void show3();
}

這就是沒有抽象方法的抽象類。

思想很重要。之所以使用繼承,是為了在對共性型別操作時更為簡單。

相關推薦

JAVA飾詞3----abstract 抽象

1.引入概念: 狼和狗,兩個類,抽取他們所屬的共性:犬科。 犬科都有吼叫行為,具體是汪汪汪還是嗷嗷嗷,是不確定的,需要子類明確。 這些犬科不具體的功能,需要在類中標識出來,通過java中的關鍵字abstract(抽象) 定義了抽象函式的類也要

java===java基礎學習3---數據型轉換,運算符級別,枚舉

test [] sof 進度 如果 nbsp math 否則 枚舉 數據類型轉換: 有的時候,程序需要將數據類型,比如 int + float ,結果是float, 這裏的int就被轉換為float類型,屬於合法轉換。 Java中的合法轉換如下圖: 紅色表示無信息丟失的轉

【深入Java虛擬機3】:初始化

不同 main class out pri ref 另一個 字節碼 被動引用 類初始化是類加載過程的最後一個階段,到初始化階段,才真正開始執行類中的Java程序代碼。虛擬機規範嚴格規定了有且只有四種情況必須立即對類進行初始化:遇到new、getstatic、putstati

java之介面interface抽象abstract關鍵字詳解

1.抽象類: abstract class kabstract { public abstract void say(); public abstract void run(); }(1)抽象類必須用abstract【抽象的,】關鍵字修飾 (2)抽象方法是

java介面interface抽象abstract class的區別

很久沒有看到如此精闢的文章了!作者寫得實在太好了!正在學JAVA或者想了解抽象類與介面的朋友,絕對不可錯過!本人極力推薦! OOP中介面與抽象類的區別 Java語言介面與繼承的本質 深入理解介面和抽象類   OOP中介面與抽象類的區別 OOP中的INTERFACE和ABST

java入門學習3—循環,選擇,基礎算法,API概念

思想 冒泡 方法 就是 最大的 接口 兩個 循環控制 得到 1、順序結構:也就是順著程序的前後關系,依次執行。2、選擇分支:利用if..else , / switch(){case [ 這個必須是常量]:}; / if..else if….. ….else..等語句讓程序在

java基礎筆記3----函數

註意 靜態函數 宋體 blog tro 過多 ava col nbsp 前言引入函數前,所有的代碼都寫在main主函數中,代碼過多,代碼冗余,可讀性差。 引入函數後,函數是實現某一特定功能的代碼塊。一個類中可以定義多個函數,每個函數和main主函數都是並列關系。 函數: 語

Java並發3- 聊聊Volatile

我們 public 判斷 out 每次 ada 事務 分析 ron 引言 談到volatile關鍵字,大多數開發者都有一定了解,可以說是開發者非常熟悉,深入之後又非常陌生的一個關鍵字。相當於輕量的synchronized,也叫輕量級鎖,與synchronized相比性能上開

Java筆試題3

scan abd bst spl 輸出 rst != first adf /** * 輸入: * safab qeabd abdfe (以空格隔開) * ab * 輸出ab出現的次數並逆序輸出含有ab的字符串 * 輸出: * 3 * a

23種設計模式3抽象工廠模式

如果 劃分 產品 升級版本 特點 client 形式 inter system 定義:為創建一組相關或相互依賴的對象提供一個接口,而且無需指定他們的具體類。 類型:創建類模式。 類圖: 抽象工廠模式與工廠方法模式的區別 抽象工廠模式是工廠方法模式的升級版本,他用來創

Java語法糖3:泛型

rgs fir double new t exc The 編譯器 sta arraylist 泛型初探 在泛型(Generic type或Generics)出現之前,是這麽寫代碼的: public static void main(String[] args){List l

public、protected、private訪問許可權飾詞原創

1.private: 被private修飾的只能是同一個類的可以訪問,跨類都不行。(如果構造器被宣告成了private,則不可以通過new來新建一個物件,可以使用static的方法返回一個new物件)   2.什麼也不加的預設是包訪問控制權限:只有同一個包下的可以呼叫,跨包的類

Java基礎部分3

Java中的常用類2   集合  陣列與集合的區別:   1、陣列長度固定,集合長度可變。   2、陣列可以儲存基本資料型別,集合只能儲存物件。  集合類的結構圖以及相關特點: Collection  |--List 有序,可重複    |--ArrayList      

Java併發程式設計3:執行緒掛起、恢復與終止的正確方法含程式碼

JAVA大資料中高階架構 2018-11-06 14:24:56掛起和恢復執行緒Thread 的API中包含兩個被淘汰的方法,它們用於臨時掛起和重啟某個執行緒,這些方法已經被淘汰,因為它們是不安全的,不穩定的。如果在不合適的時候掛起執行緒(比如,鎖定共享資源時),此時便可能會發生死鎖條件——其他執行緒在等待該

Java詳解3--MyEclipse安裝

MyEclipse-8.6.1-win32安裝 平臺:Win7 檔案: Myeclipse8.6.1 http://downloads.myeclipseide.com/downloads/products/eworkbench/galileo/myeclipse-8.6.1-win32.e

Java原始碼系列3:列舉型別

hello,everybody。沒想到今天會推文吧,趕緊誇我,勤快的小仙女。 好,我們今天認真的講一下列舉型別,大家肯定都用過,比如這樣的 //定義列舉型別 enum Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY

JAVA高階基礎3---Iterator

Iterator Iterator迭代器 它是Java集合的頂層介面(不包括map系列的集合,Map介面是map系列集合的頂層介面) 注:更多詳細方法請自行在 API 上查詢  Iterator 介面是專門用來對集合進行迭代的一個迭代器(遍歷)。對集合

Java程式設計思想3

第10章 內部類 1 可以將一個類的定義放在另一個類的定義內部,就是內部類 public class ArrayApp { class Contents{ private int i = 11; public int value(){ return i;} } class De

Java集合---LinkedList3

用途與特點 可用於儲存有序資料,底層使用連結串列形式進行資料儲存。 該集合理論上只要記憶體可以存放資料,就可以一直新增,是無限擴容的。 實現演算法 底層使用Node的自定義物件進行儲存,該物件中包含當前儲存的數item、上一個節點prev、和下一個節點next 這三個屬性來實現。但該連結串列是非環形,第一個f

Java 設計模式抽象工廠模式

參考連結:抽象工廠模式-Abstract Factory Pattern 工廠方法模式解決了簡單工廠模式存在的問題,但由於工廠方法模式中的每個工廠只生產一類產品,可能會導致系統中存在大量的工廠類,勢必會增加系統的開銷。此時,我們可以考慮將一些相關的產品組成一個“產品族”,由同一個工廠