luogg_java學習_抽象類_介面_多態學習總結

来源:http://www.cnblogs.com/luogg/archive/2016/08/19/5789006.html
-Advertisement-
Play Games

這篇博客總結了半天,希望自己以後返回來看的時候理解更深刻,也希望可以起到幫助初學者的作用. 轉載請註明 出自 : "luogg的博客園" , 抽象 一種專門用來做父類,被繼承的. (模板) 格式: abstract class 抽象類名{ 屬性; 普通方法; 訪問許可權 abstract 返回值類型 ...


這篇博客總結了半天,希望自己以後返回來看的時候理解更深刻,也希望可以起到幫助初學者的作用.
轉載請註明 出自 : luogg的博客園 ,

抽象

一種專門用來做父類,被繼承的. (模板)

格式:

abstract class 抽象類名{
    屬性;
    普通方法;
    訪問許可權 abstract 返回值類型 方法名稱([形參]);//抽象方法,無方法體
}

這裡寫圖片描述

抽象類中, 不寫訪問許可權的時候, 預設是default, 不同於介面中的預設(介面方法預設被public abstract 修飾), 子類在繼承抽象類時候, 需要重寫抽象類中方法, 修飾符可以預設不寫(default)或者寫public , 但在介面中重寫時必須為public

抽象類的定義及使用:

1, 定義父類為抽象類,並定義沒有方法體的抽象方法
2, 子類繼承抽象類, 並重寫父類的抽象方法,寫入方法體,去掉abstract

使用抽象類註意事項:

1, 抽象類本身不可以創建對象, 因為它不可以被實例化,即不能構造一個該類的對象.
2, 抽象類有構造方法, 在子類實例化前也會預設的調用它的無參構造方法, 只要是類, 都有構造方法
3, 抽象類中不一定要有抽象方法,但是有抽象方法的類, 一定要被聲明為抽象類,不然編譯不通過
4, abstract只能修飾類和方法
abstract 不能用來修飾屬性, 構造器, 不能與private , final , static 共用

  • 屬性不能被覆蓋,重寫,
  • 構造器不能被重寫
  • private只能在本類中調用,不能被繼承,不能被重寫
  • fianl修飾方法,不能被重寫 , 修飾類, 不能被繼承

抽象類與普通類的區別

這裡寫圖片描述

介面

概念

介面可以理解為一種特殊的抽象類, 對行為的抽象, 由全局常量和公有抽象方法組成 , 介面的作用是用來被實現的(implement) , 介面屬於複合類型,

定義

[訪問修飾符] interface I介面名{
    屬性(全局常量,預設被static final修飾);
    抽象的方法(沒有方法體,方法預設被public abstract修飾);
}

這裡寫圖片描述

註意事項:

1, 子類實現介面,重寫方法的時候,修飾符必須加public,當介面中用預設的時候,因為介面方法預設是public+abstract修飾的
2, 介面沒有構造方法,沒有辦法創建對象
3, 介面名字必須以大寫I開頭
4, 介面的作用是為了彌補java中的單繼承,介面之間可以多extends,
5, 介面不可以繼承抽象類, 但是介面可以extends 多個介面, 抽象類可以implements介面,普通類可以implements多個介面

介面和抽象的混搭使用

當子類既要繼承抽象類 , 又要實現介面的時候, 先extends 抽象類, 然後再 implements 介面1,介面2..{}

public class Test2 {
    public static void main(String[] args) {
        P p1 = new P();
        p1.tell2();
//      static修飾的age,靜態全局常量,
        System.out.println(I1.age);
        System.out.println(I2.age);
        System.out.println(I3.age);
        
        p1.tell1("花花");
        p1.tell1();
    }
}
//定義一個抽象類
abstract class Abs1 implements I1,I2{//抽象類可以implements多個介面,但是不可以extends介面
    String name;
//  抽象類可以有構造方法
    Abs1() {
        
    }
    Abs1(String name){
        
    }
    abstract void tell1();
}
//定義介面
interface I1 extends I2,I3{//介面和介面之間可以多extends,但是介面不可以extends抽象類,介面不可以implements介面
    int age = 10;//不可以使用int age;因為預設是final
    
    /*I1(){
        //Interfaces cannot have constructors
    }*/
    
//  定義介面的抽象類
    void tell2();
}

interface I2{
    int age = 20;
    void tell3();
}

interface I3{
    int age = 30;
    void tell4();
}
class P extends Abs1 implements I1,I2,I3{
//  抽象類可以有構造方法
    void tell1(String name) {
        System.out.println("抽象方法被執行...");
    }
    public void tell2() {
        System.out.println("介面1的方法被執行...");
    }
    public void tell3() {
        System.out.println("介面2的方法被執行...");
    }
    public void tell4() {
        System.out.println("介面3的方法被執行...");
    }
    @Override
    void tell1() {
        System.out.println("抽象方法被執行...");
    }

這裡寫圖片描述

抽象類和介面的區別

這裡寫圖片描述

多態

概念

一個事物的多種表現形態,多種狀態.
1, 方法的重寫與重載
2, 子類對象的多態性 Person p1 = new Man();
3, 父類的引用指向子類對象

多態的實現

向上轉型

  • 向上轉型,可以調用父類方法也可以調用本類方法
  • 但是父類和子類有相同方法sleep的時候,調用時候會調用子類方法
    向下轉型(使用的不多)

instanceof關鍵字

表示運算符前面的這個對象是不是運算符後面的類的實例
對象 instanceof 類
只要是本類和本類的父類,都是返回true, 包括Object類

虛方法的調用

1, 當子類覆寫了父類中的方法,在發生多態的時候,調用的是子類的方法
2, 通過父類的引用指向子類的對象實體, 當調用方法時, 實際執行的是子類重寫父類的方法

使用多態

public class TeachTest {
    public static void main(String[] args) {
        //實例化一個新的數學老師,
        //向上轉型,可以調用父類方法也可以調用本類方法
        //但是父類和子類有相同方法sleep的時候,調用時候會調用子類方法
        Teacher t1 = new MathTeacher();//向上轉型
        t1.teach();
        t1.sleep();
        t1.speak();
        
        //強制將Teacher 轉換為MathTeacher(向下轉型)
        MathTeacher mt = (MathTeacher)t1;
        mt.teach();
        //使用封裝了的方法
        EnglishTeacher e = new EnglishTeacher();
        TeacherAll(e);
        
        System.out.println(e instanceof Teacher);
    }
    /*
             如果要調用類的方法,先實例化一個類,然後分別調用
             MathTeacher mt = new MathTeacher();
             mt.teach();
             mt.sleep();
             ChineseTeacher ct = new ChineseTeacher();
             ct.teach();
             ct.sleep();
             發現這樣比較麻煩,向上抽取,定義一個新的工具類TeachTest的TeacherAll方法,將方法封裝進去
             */
    public static void TeacherAll(Teacher t) {
        t.sleep();
        t.teach();
    }
}

abstract class Teacher{
    abstract void teach();
    void sleep() {
        System.out.println("老師在睡覺...");
    }
    void speak() {
        System.out.println("老師正在說話...");
    }
}
class MathTeacher extends Teacher{
    void teach() {
        System.out.println("數學老師在講數學...");
    }
    void sleep() {
        System.out.println("數學老師正在躺著睡覺...");
    }
}
class EnglishTeacher extends Teacher{
    void teach() {
        System.out.println("英語老師在教英語...");
    }
    void sleep() {
        System.out.println("英語老師睡在沙發上...");
    }
}

運行結果:
這裡寫圖片描述


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

-Advertisement-
Play Games
更多相關文章
  • 物聯網涉及到各種設備、各種感測器、各種數據源、各種協議,並且很難統一,那麼就要有一個結構性的框架解決這些問題。SSIO就是根據時代發展的階段和現實實際情況的結合產物。 各種數據信息,如下圖: 解決方案,配合SIO使用: 一、SSIO特點 輕型高性能通信框架,適用於多種應用場,輪詢模式、自控模式、併發 ...
  • 遞歸演算法這個是非常常見的一個演算法,也是大多數人都會用的,因為它足夠簡單,通俗易懂!在遍歷城市,樹等大腦里反應出來的第一方法大多就屬於這個了 遞歸容易使用,但是也容易用壞,我想"記憶體溢出"這個估計是每個人用遞歸都會碰到的bug,我為什麼還是要寫這方面的知識呢,那是因為文章的最後我有一個問題要問 首先我 ...
  • 前提概要 當需要同時處理多個url時,可採用curl_multi_perform方式執行,如下代碼1: 問題概要 現在我的url為訂閱方式,每個curl都會一直收數據(即使沒數據也會每10s收到一幀心跳消息),永遠不會退出,即上面的迴圈永遠在執行,這樣我無法運行到"解析數據"那一步。所以我需要在迴圈 ...
  • 下載鏈接 ...
  • 謹記:在C語言中,當兩種不同類型之間運算時,低位元組長度類型會向高自己長度類型轉換,有符號會向無符號類型轉換。 舉例子如下: 輸出: -1 <= 1 -1 <= 1 當C2與i進行比較時,由於C2是有符號8位,i是無符號32位,根據C語言的規則,c2被轉換成32位,即-1的補碼,故會得出-1>1的結論 ...
  • Python的誕生 Python的創始人吉多·範羅蘇姆(Guido van Rossum),在1989年12月的聖誕節期間,為了打發時間,決定開發一種新的腳本解釋程式,作為ABC語言的繼承。 現在,python以其優美,清晰,簡單的特性在全世界廣泛流行,成為最主流的編程語言之一。 截止至2016年7 ...
  • 先來看一段簡單的代碼: 輸出結果為: 由此可見,定義:在Eat(冒號函數)內部有一個參數self,在Sleep(點函數)內部沒有參數self;調用:用冒號(:)調用函數時,會預設傳一個值(調用者自身)作為第一個參數;用點(.)調用函數時,則沒有; -- 如果要使結果一致,則: 輸出結果: -- 我們 ...
  • DBCP連接池簡介 1、資料庫連接基礎 資料庫連接池基礎主要包括以下三個方面的內容:資料庫連接池的基本概念、資料庫連接池的工作原理、Java開源的連接池。下麵將從這三個方面一一介紹: (1)資料庫連接池的基本概念 資料庫連接是一種關鍵的、有限的、昂貴的資源,這一點在多用戶的Web應用程式中體現得尤為 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...