JAVA學習筆記--介面

来源:http://www.cnblogs.com/tongye/archive/2017/04/06/6649990.html
-Advertisement-
Play Games

一、抽象類和抽象方法 在談論介面之前,我們先瞭解一下抽象類和抽象方法。我們知道,在繼承結構中,越往下繼承,類會變得越來越明確和具體,而往上回溯,越往上,類會變得越抽象和通用。我們有時候可能會需要這樣一個類,它只是表示了一個介面,但並沒有具體的實現,這就是一個抽象類。 抽象方法只有方法聲明而沒有方法體 ...


一、抽象類和抽象方法

  在談論介面之前,我們先瞭解一下抽象類和抽象方法。我們知道,在繼承結構中,越往下繼承,類會變得越來越明確和具體,而往上回溯,越往上,類會變得越抽象和通用。我們有時候可能會需要這樣一個類,它只是表示了一個介面,但並沒有具體的實現,這就是一個抽象類。

  抽象方法只有方法聲明而沒有方法體,也就是說用戶並不知道這個方法是如何實現的。抽象方法的聲明用到了 abstract 關鍵字,聲明方法如下:

  abstract void f();        // 聲明一個抽象方法

  包含抽象方法的類叫做抽象類。如果一個類包含一個或多個抽象方法,那麼該類必須被限定為抽象的。抽象類也用關鍵字abstract進行說明。

1)抽象類看起來和普通類相像,但是抽象類不能用new操作符創建它的實例;抽象類中抽象方法只有定義而沒有實現,它的實現由子類提供;

2)抽象類可以被繼承,但是其導出類必須為基類中所有的抽象方法提供方法定義,如果不這樣做,那麼導出類也將被強制限定為抽象類;

3)抽象類中可以沒有抽象方法,這樣的抽象類通常被用作基類型;

4)抽象類的構造方法定義為protected,這個構造方法在其子類的構造方法中被調用;

5)即使父類是具體的,其子類也可以是抽象的;

6)不能用new操作符創建一個抽象類的實例,但是抽象類可以用作一種數據類型被new調用。

 下麵是一個簡單的抽象類的例子:

package com.tongye.abstraction;

abstract class chouxiang{
    abstract void f();        // 抽象方法
}

class chouxiang1 extends chouxiang{
    void f(){
        System.out.println("抽象");
    }
}

public class Abstraction {
    public static void main(String[] args){
        chouxiang1 abstraction = new chouxiang1();
        abstraction.f();
    }
}

 

二、介面

   介面 interface 關鍵字使抽象的概念更向前邁了一步。abstract關鍵字允許人們在類中創建一個或多個沒有任何定義的方法,即提供了介面部分,但是沒有提供具體實現,其實現是由類的繼承者來創建的。 interface 關鍵字產生一個完全抽象的類,它根本沒有任何具體實現。

1)介面允許創建者確定方法名、參數列表和返回類型,但是沒有任何方法體;介面只提供了形式,而未提供任何具體實現;

2)要創建一個介面,需要用interface關鍵字來代替class關鍵字。可以在interface前面添加public關鍵字(僅限於該介面在與其同名的文件中被定義);如果不聲明,則它只包含包訪問許可權,只能在一個包內可用;

3)介面可以包含域,但這些域隱式地是 static 和 final 的;

4)可以用implements關鍵字來表明一個類實現了某個特定介面,即: class A implements B{} ;

下麵是一個簡單的應用介面的例子:

package com.tongye.interfaces;

import java.util.Random;

public interface StudentMessages {
    Random rand = new Random(47);
    int age = rand.nextInt(20);        // 介面中的數據域
    void studentName();                // 介面中的方法,只有方法名而沒有方法體
    void studentAge();
    void studentGrade();
}


package com.tongye.interfaces;

/* 類StudMessage1只實現了StudentMessages介面的部分方法,因而是抽象類 */
abstract class StudMessage1 implements StudentMessages {
    
    private String Stu_Name = "tongye";
    private int Stu_Age = age;
    private char Stu_Grade;
    
    /* 這是介面中方法的實現 */
    @Override
    public void studentName() {
        getName();
    }

    @Override
    public void studentAge() {
        System.out.println(Stu_Age);
    }
    
    /* 這是新類自帶的方法 */
    public void getName(){
        System.out.println("my name is" + Stu_Name);
    }
}

/* StudMessage2繼承自StudMessage1,並實現了StudentMessages介面中的部分方法 */
class StudMessage2 extends StudMessage1{
    @Override
    public void studentGrade() {
        System.out.println("1301");
    }
}

public class Student {
    public static void main(String[] args){
        StudMessage2 stud = new StudMessage2();
        stud.studentName();
        stud.studentAge();
        stud.studentGrade();
    }
}

  介面一個很重要的作用就是,可以實現類似C++中的多重繼承功能。我們知道,JAVA是不支持多重繼承的,但是通過使用介面,我們可以實現類似功能,用來表示“一個x是一個a和一個b以及一個c”。一個類可以繼承任意多個介面,這需要將所有的介面都置於implements關鍵字之後並用逗號隔開;可以將這個類向上轉型為每個介面,因為每一個介面都是一個獨立的類型。下麵這個程式演示了一下介面的這個功能:

/********/
package com.tongye.interfaces;

public interface People {
    void isPeople();
}

/********/
package com.tongye.interfaces;

public interface Juniors {
    void isJuniors();
}

/********/
package com.tongye.interfaces;

public interface Chinese {
    void isChinese();
}

/********/
package com.tongye.interfaces;

class students implements People,Chinese,Juniors{
    @Override
    public void isPeople(){
        System.out.println("The student is a people");
    }

    @Override
    public void isJuniors() {
        System.out.println("The student is a junior");
    }

    @Override
    public void isChinese() {
        System.out.println("The student is a Chinese");
    }
}

public class Student{
    public static void people(People a){    // 介面作為一種數據類型傳遞給方法
        a.isPeople();
    }
    public static void junior(Juniors a){
        a.isJuniors();
    }
    public static void chinese(Chinese a){
        a.isChinese();
    }
    
    public static void main(String[] args){
        students stud = new students();
        people(stud);     // stud被向上轉型為People類型
        junior(stud);     // stud被向上轉型為Juniors類型
        chinese(stud);    // stud被向上轉型為Chinese類型
    }
}

從這個程式中可以看出,類students既是People又是Juniors又是Chinese,在main方法中調用方法people、junior、chinese時,stud分別被向上轉型為People、Juniors和Chinese,這大大提升了代碼的靈活性。

 


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

-Advertisement-
Play Games
更多相關文章
  • 1 class egg 2 { 3 public static void main(String[]args) 4 { 5 for(int n=10;n<100000;n++) 6 { 7 if(n%2==1){ 8 if(n%3==0){ 9 ... ...
  • Problem B: 時間和日期類(III) Description 設計一個日期時間類,用於讀取輸入的數據,按格式輸出日期和時間。 設計日期時間類DateTime由2個成員組成,分別是一個Date類對象和一個Time類對象; 設計DateTime類需支持以下操作: DateTime::DateTi ...
  • 1 #include 2 #include 3 #include 4 using namespace std; 5 int f(int x,int n) 6 { 7 int now=1; 8 while(n) 9 { 10 if(n&1) 11 { 12 now=now*x; 13 ... ...
  • 題目背景 大家都知道,斐波那契數列是滿足如下性質的一個數列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 為整數)。 題目描述 請你求出第n個斐波那契數列的數mod(或%)2^31之後的值。並把它分解質因數。 輸入輸出格式 輸入 ...
  • Laravel號稱巨匠級PHP框架,越來越多的PHPer選擇它作為開發框架,作為一個Laravel初學者相信很多人向我一樣被安裝擋在了門外。所以今天結合文檔和自己的學習經歷總結一下Laravel的安裝方法,希望大家在學習Laravel的時候少走些彎路。Laravel安裝方法大的來分可以分為利用Com ...
  • 前言: 今晚寫一篇關於學員/講師/銷售員CRM系統。這個小項目是27號開始做的,大概搞了一星期不到。我把一些知識點總結下,還寫下當時剋服的BUG。 Django練習小項目:學員管理系統設計開發 帶著項目需求學習是最有趣和效率最高的,今天就來基於下麵的需求來繼續學習Django 項目需求: 拿到需求後 ...
  • 1 jdbc 鏈接兩種方式,通過jdbc鏈接mysql資料庫,url:jdbc:mysql://ip:埠[/database name] 通過什麼驅動器,鏈接什麼資料庫,資料庫的ip,連接埠,可以在url中加上連接的資料庫名。 1)使用驅動器獲取鏈接 2) 使用驅動管理器獲取鏈接 DriverM ...
  • 題目描述 輸入n,編寫程式輸出斐波那契數列的第n項。其中斐波那契數列f(n)的定義如下: f(1)=0,f(2)=1 f(n)=f(n-1)+f(n-2)(n>=2) 題目描述 輸入n,編寫程式輸出斐波那契數列的第n項。其中斐波那契數列f(n)的定義如下: f(1)=0,f(2)=1 f(n)=f( ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...