Java面向對象--介面和多態

来源:https://www.cnblogs.com/paopaoT/archive/2023/04/01/17279163.html
-Advertisement-
Play Games

去年公司由於不斷發展,內部自研系統越來越多,所以後來搭建了一個日誌收集平臺,並將日誌收集功能以二方包形式引入各個自研系統,避免每個自研系統都要建立一套自己的日誌模塊,節約了開發時間,管理起來也更加容易。 這篇文章主要介紹如何編寫二方包,並整合到各個系統中。 先介紹整個ELK日誌平臺的架構。其中xia ...


final 關鍵字

最終修飾符 可以修飾 類 方法 變數

被final修飾後不能被繼承 重寫 二次賦值
修飾類時 該類不可以被繼承
修飾方法時 該方法不能被重寫
修飾變數時, 該變數只能賦值一次, 不可以二次賦值 是常量
修飾引用變數時, 地址值不能改變 但對象中的屬性值可以改變
修飾成員變數時, 必須在類中顯性賦值 或 在所有構造方法中對其賦值

介面

介面是功能的集合 描述的是功能 介面中都是抽象方法(JDK1.8之前)
定義格式

public interface 介面名{
	抽象方法;
}

介面的使用

1.介面不能創建對象
2.使用類實現介面
3.重寫抽象方法
4.創建實現類對象 調用方法

實現的動作類似繼承 就是關鍵字不同

public class 類  implements 介面{
	重寫方法
}

介面的成員特點

介面沒有構造方法
介面中的成員變數 被public static final修飾 是常量
介面中的成員方法 被public abstract修飾

介面的特點

類與類 單繼承
類與介面 多實現
介面與介面 多繼承
類可以在繼承一個類的同時 實現多個介面

介面與抽象類的區別

成員區別
	構造方法
		介面沒有構造方法
		抽象類有構造方法 給子類使用
	成員變數 
		介面沒有變數 只有常量
		抽象類既可以有變數 也可以有常量
	成員方法
		介面中的方法都是抽象的 
		抽象類中 既可以有抽象方法 也可以有具體的方法
	思想的區別
		抽象類描述的是一類事物的共性內容
		介面描述的是功能

多態

多態的前提

1.繼承或者是實現關係
2.需要有方法重寫

多態的格式

父類引用指向子類對象

具體類  變數 = new 子類對象();
抽象類  變數 = new 子類對象();
介面  變數 = new 實現類對象();

多態後訪問的成員特點

成員變數
	編譯時 到父類中找 如果有編譯通過 沒有報錯
	運行時  列印的父類成員變數的值
	編譯時  看左邊
	運行時  看左邊 
成員方法
	編譯時 到父類中找 如果有編譯通過 沒有報錯
	運行時  子類重寫後的方法 
	編譯時 看左邊
	運行時 看右邊
多態後 一切都是父類的表現形式 只有方法運行的子類重寫後的方法.

向上轉型和向下轉型

// 向上轉型
// 多態本身就是向上轉型
Fu fz = new Zi();
// 向下轉型
// 向上轉型後 不能訪問子類特有功能
// 要想訪問 需要向下轉型
Zi zf = (Zi)fz;

// 需要註意
Fu fu = new fu();
Zi  zi = (Zi)fu; //拋運行時異常  ClassCastException 類型轉換異常

instanceof關鍵字

判斷某個對象是否屬於某種類型 是返回true, 否返回false

boolean b = 對象 instanceof 類型;
if(對象 instanceof 類型){}

練習

員工類
	屬性
		id
		name
		基本工資
	行為
		計算工資  抽象

經理類
	屬性
		id
		name
		基本工資
		管理工資
	行為 
		計算工資  基本工資+管理工資
程式員
	屬性
		id
		name
		基本工資
		項目獎金
	行為
		計算工資  基本工資+項目獎金


公司類
	行為
		查看員工工資(員工){
			員工的工號:38250
			員工的姓名:柳岩
			員工的職位:經理
			員工的工資:11111.00
		}
練習
// Employee.java
public abstract class Employee {
    String id;
    String name;
    private double salary;

    public Employee() {
    }

    public Employee(String id, String name, double salary) {
        this.id = id;
        this.name = name;
        this.salary = salary;
    }

    public abstract double calculateSalary();

    public String getName() {
        return name;
    }


    public double getSalary(){
        return salary;
    }
}

// Manager.java
public class Manager extends Employee{
    private double additionalSalary;

    public Manager() {
    }

    public Manager(String id, String name, double salary, double additionalSalary) {
        super(id, name, salary);
        this.additionalSalary = additionalSalary;
    }

    public double getAdditionalSalary() {
        return additionalSalary;
    }

    public void setAdditionalSalary(double additionalSalary) {
        this.additionalSalary = additionalSalary;
    }

    @Override
    public double calculateSalary() {
        return super.getSalary() + getAdditionalSalary();
    }
}


// Programmer.java
public class Programmer extends Employee{
    private double projectSalary;

    public double getProjectSalary() {
        return projectSalary;
    }

    public Programmer() {
    }

    public Programmer(String id, String name, double salary, double projectSalary) {
        super(id, name, salary);
        this.projectSalary = projectSalary;
    }

    public void setProjectSalary(double projectSalary) {
        this.projectSalary = projectSalary;
    }

    @Override
    public double calculateSalary() {
        return super.getSalary() + getProjectSalary();
    }
}
// Company.java
public class Company {
    public void lookEmployeeSalary(Employee employee) {
        String position = "員工";
        if (employee instanceof Manager) {
            position = "經理";
        } else if (employee instanceof Programmer){
            position = "程式員";
        }
        System.out.println("員工的工號: " + employee.id);
        System.out.println("員工的姓名: " + employee.name);
        System.out.println("員工的職位: " + position);
        System.out.println("員工的工資: " + employee.calculateSalary());
    }
}
public class Demo {
    public static void main(String[] args) {
        Company company = new Company();
        company.lookEmployeeSalary(new Manager("001", "經理一號",20000, 3000));
        System.out.println("============================");
        company.lookEmployeeSalary(new Programmer("002", "程式員一號",20000, 3000));

    }
}

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

-Advertisement-
Play Games
更多相關文章
  • 一:在hadoop3.3中安裝配置sqoop1.4.7 前言: sqoop功能已經非常完善了,沒有什麼可以更新的了,官方停止更新維護了。因此官方集成的hadoop包停留在了2.6.0版本,在hadoop3.3.0版本會提示類版本過低錯誤,但純凈版sqoop有缺少必須的第三方庫,所以將這兩個包下載下來 ...
  • 1. 集合論是SQL語言的根基 1.1. UNION 1.1.1. SQL-86標準 1.2. NTERSECT和EXCEPT 1.2.1. SQL-92標準 1.3. 除法運算(DIVIDE BY) 1.3.1. 沒有被標準化 2. 註意事項 2.1. SQL能操作具有重覆行的集合,可以通過可選項 ...
  • 說明 有讀者反饋: 學習uniapp ios 插件開發不知道從哪些文章看起,沒有一個清晰的學習路線 本文就做一個解答。 首先本系列的文章是作者精心排過序的,如果想要完整的學習uniapp ios原生插件開發技術的話,建議是按文章順序瀏覽。 當然您如果有相關的開發經驗,且只對某一技術實現感興趣的話,也 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 最近碰到這樣一個問題,在一張封面上直接顯示書名,可能會存在書名看不太清楚的情況(容易受到背景干擾),如下 為瞭解決這個問題,設計師提了一個“究極”方案,將書名背後的圖片模糊一下,這個在 CSS 中很好實現,僅需backdrop-filte ...
  • 路由守衛 作用:對路由進行許可權控制 配置路由守衛應在暴露前配置 分類:全局守衛、獨享守衛、組件內守衛 首先先給需要鑒權的路由設置好meta配置項。 meta配置項:是vue-router中的一個對象,主要用於存儲路由的元數據(meta data)信息。這些元數據信息可以是一些描述性的內容,比如頁面的 ...
  • 泛型、Trait、生命周期 一、提取函數消除重覆 fn main() { let number_list = vec![34, 50, 25, 100, 65]; let mut largest = number_list[0]; for number in number_list { if num ...
  • Spring是什麼? Spring是一個輕量級的控制反轉(IoC)和麵向切麵(AOP)的容器框架。 Spring的優點 通過控制反轉和依賴註入實現松耦合。 支持面向切麵的編程,並且把應用業務邏輯和系統服務分開。 通過切麵和模板減少樣板式代碼。 聲明式事務的支持。可以從單調繁冗的事務管理代碼中解脫出來 ...
  • 無論對於什麼業務來說,用戶數據信息的安全性無疑都是非常重要的。尤其是在數字經濟大火背景下,數據的安全性就顯得更加重要。數據脫敏可以分為兩個部分,一個是DB層面,防止DB數據泄露,暴露用戶信息;一個是介面層面,有些UI展示需要數據脫敏,防止用戶信息被人刷走了。 v需求背景 DB層面的脫敏今天先不講,今 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...