淺談Java抽象類

来源:http://www.cnblogs.com/419liu/archive/2017/09/03/7467331.html
-Advertisement-
Play Games

什麼是抽象類?這名字聽著就挺抽象的,第一次聽到這個名字還真有可能被唬住。但是,就像老人家所說的,一切反動派都是紙老虎,一切有著裝x名字的概念也是紙老虎。好吧,我們已經從戰略上做到了藐視它,現在就要戰術上重視它,如同要解決紙老虎,就要一個牙齒一個牙齒地敲,一個爪子一個爪子地拔;解決這種抽象概念也一樣, ...


      

       什麼是抽象類?這名字聽著就挺抽象的,第一次聽到這個名字還真有可能被唬住。但是,就像老人家所說的,一切反動派都是紙老虎,一切有著裝x名字的概念也是紙老虎。好吧,我們已經從戰略上做到了藐視它,現在就要戰術上重視它,如同要解決紙老虎,就要一個牙齒一個牙齒地敲,一個爪子一個爪子地拔;解決這種抽象概念也一樣,先要把它具體化,細分化,然後一個一個地來。

我一般遇到新的概念都會問三個問題:

1.這個東西有什麼用?用來乾什麼的?它的意義在哪裡?(顯然,如果是沒用的東西,就沒必要浪費時間了;其實,弄懂了這個問題,就掌握了60%)

2.這個概念或者技能點怎麼用?也就是它的表現形式,如關鍵字、修飾詞、語法什麼的。。。(這個占20%)

3.這個東西在用的過程中,有哪些關鍵點和細節點?(是的,也占20%)

上面三個問題搞清楚了,剩下的就是去用了。。。“無他,但手熟爾。”

 

一、第一個問題:抽象類有什麼用?它存在的意義是什麼?

這回答這個問題之前,先看一下動物界里的一個例子:首先,有一個父類Animal,接著有兩個子類,分別是鳥Bird和狗Dog,如下:

 1 public class Animal{
 2     public void bark(){}
 3 }
 4 public class Bird extends Animal{
 5     public void bark(){
 6         System.out.println("唧唧~唧唧~");
 7     }
 8 }
 9 public class Dog extends Animal{
10     public void bark(){
11         System.out.println("汪汪~汪汪~");
12     }
13 }

可以看到,父類Animal有一個叫喚的方法bark(),兩個子類都繼承了這個方法,併進行了重寫,Bird是唧唧叫,Dog是汪汪叫,現在的問題是Animal怎麼叫?它的bark()方法體里應該輸出什麼樣的叫聲,是“汪汪”還是“唧唧”?
顯然,動物是個抽象的集合名詞,我們並不知道動物Animal怎麼叫,所以,bark()方法在父類中實現不了,或者說實現了沒有任何意義,bark()方法只能在子類中根據具體情況去實現。這樣的話就可以把父類Animal中的bark()方法聲明為abstract抽象方法,此時這個類也成了abstract抽象類。

至此,也就可以回答第一個問題,抽象類用來做什麼的?抽象類自己並不能實例化,它存在的意義就是為了讓子類繼承。對於一個父類,它的某個方法在父類中實現沒有任何意義,必需在子類中根據具體情況實現,那麼這個方法可以聲明為abstract抽象方法,此時這個父類也成了abstract抽象類。(當然,你也許會想,就像上面那樣,函數的花括弧里為空不也可以?是的,語法上沒毛病,甚至用法上也沒毛病,但一般還是把它抽象成abstract方法。原因有三點:1.就像上面說的,這樣弄“實現了沒有任何意義”;2.Java裡面不鼓勵函數體的內容為空;3.用法上子類繼承父類後,子類會被強制重寫父類中的抽象方法,起到一個提醒和約束的作用。)

二、第二個問題:抽象類怎麼用?表現形式是什麼樣的?

這個問題相對簡單,就是語言設計者的一些規定,Java中規定用abstract來修飾抽象方法和抽象類。上面的Animal類寫成如下形式:

1 public abstract class Animal{
2     public abstract void bark();
3 }

三、第三個問題:抽象類在用的過程中有哪些關鍵點?
抽象類並不是只能包含抽象方法,他也可以包含普通的成員方法和成員變數。它和普通類的區別主要有三點:

1.抽象類中的抽象方法只能用public或protected修飾。因為,抽象方法來到世間就是為了讓子類繼承重寫的,而private屬性的方法不能被子類繼承,顯然矛盾。

2.抽象類不能創建對象,即不能實例化。因為,抽象類中包含沒有實現的抽象方法,是不完整的,所以不能用來創建對象。(有一種特殊情況,就是一個類中並沒有抽象方法,但是類class有abstract修飾,被聲明為抽象類,那麼這個類也是抽象類,也不能實例化。)

3.如果一個類繼承於一個抽象類,那麼子類必須實現父類的抽象方法。否則,子類繼承的方法還是抽象方法,子類也變成了抽象類,要用abstract修飾。(這就好比父母從小 have a dream,就是考大學,但是由於他們生活的年代、環境、個人能力等因素,總之沒實現,於是他們將這個夢想讓自己孩子繼承,並要求他們實現,至於你具體是考清華大學,還是考長江大學,那就 Let it be 了。。。當然,如果兒子不實現,就會變成抽象類,再讓孫子繼承和實現。。。)

在其他方面,抽象類和普通類並無區別。最後,再來個例子:

 1 public abstract class Animal {    //抽象類中可以有非抽象方法,也可以有成員變數
 2     private int a = 10;
 3     
 4     public abstract void bark();            //如果沒有此抽象方法,但是class前有absract修飾,也是抽象類,也不能實例化
 5     public void say() {                        //普通成員方法
 6         System.out.println("我是抽象類中的非抽象方法,此抽象類中的私有成員變數a= " + a);
 7     }
 8 
 9     public int getA() {
10         return a;
11     }
12     public void setA(int a) {
13         this.a = a;
14     }
15 }
16 public class Dog extends Animal{
17     public void bark() {                //子類實現Animal的抽象方法
18         System.out.println("汪汪~汪汪~");    
19         System.out.println("我是子類,不能直接調用父類的私有變數a   :(");    
20         System.out.println("我是子類,只有通過super.getA()調用父類的私有變數a:" + super.getA());    
21     }
22 }
23 public class Test {
24     public static void main(String[] args) {
25         Dog dog = new Dog();
26         dog.say();        //子類繼承調用Animal的普通成員方法
27         dog.bark();        //子類調用已經實現過的方法
28     }
29 }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 平常經常用到虛擬機,每次從gho轉換為vmdk時都要輸入cmd代碼,覺得麻煩,自己動手做了個gho2vmdk轉換工具,集成ghost32.exe文件,可以一鍵轉換,省時省事。運行時會將ghost32.exe保存到Program FIles文件夾里,運行完自動刪除ghost32.exe。覺得還不錯,在 ...
  • 今天又到了搶火車票的時候,反正是每次搶票都是傻眼。於是寫個小工具幫助自己查詢火車票,如果有票的話給自己發個郵件提示購買。 一、準備工作 利用firebug等工具,我們可以獲取到當我們單擊查詢時調用的Get請求。 請求地址: https://kyfw.12306.cn/otn/leftTicket/q ...
  • 在很多場合,我們需要線上編輯HTML內容,然後在頁面上或者其他終端上(如小程式、APP應用等)顯示,編輯HTML內容的插件有很多,本篇介紹基於Bootstrap的 summernote插件實現HTML文檔的編輯和圖片插入操作,這個控制項的使用非常方便,並且用戶群也很大。 ...
  • 郵件的內容其實是就HTML,傳統的做法都是通過在程式中拼接字元串來生成郵件的內容,生成困難,維護也困難。Razor是MVC裡面使用的視圖引擎,用來生成HTML非常方便,ZKEACMS中就是使用了Razor視圖引擎,用cshtml作為郵件模板來生成郵件內容。這樣很方便維護和修改。 ...
  • using System;using System.Drawing;using System.Windows.Forms; namespace 案例演示{ public partial class frmlogo : Form { public frmlogo() { InitializeCompo ...
  • 總結和開始記錄實驗的現象,調試代碼的經驗,同時開始用博客記錄一些技術上的進步 2017-09-01 09:01:02 1、 picturebox 上 進行覆蓋,移動,大小改變,都會觸發控制項重繪事件,重繪其本身和其所有的子控制項, 所以以繪圖區域為父容器的pictureBox在程式運行時進行的任意操作只 ...
  • python的文件操縱方法: file.readline() 讀取下一行文件,返回含有內容的字元串 file.readlines() 讀取整個文件,返回一個字元串列表 file.read() 讀取整個文件,返回一個字元串 f = open("filename","mode") 打開一個文件,mode ...
  • 要自己寫一個存儲系統,可以依照以下步驟: 1.寫一個繼承自django.core.files.storage.Storage的子類。 2.Django必須可以在無任何參數的情況下實例化MyStorage,所以任何環境設置必須來自django.conf.settings。 3.根據Storage的op ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...