JavaSE-接口

概念

在Java中,接口可以被看成是一種公共規范,是一種引用數據類型。

語法

1.接口的定義格式與類的定義格式基本相同,將class關鍵字替換為interface關鍵字:

public interface IShape {}

2.類與接口之間使用implements關鍵字來實現接口,并且這個類中必須重寫實現接口中的抽象方法

public interface IShape {void draw();
}public class Cycle implements IShape{public void draw(){System.out.println("畫一個圓圈---");}
}

抽象類和接口的區別:

1.抽象類中可以存在普通成員變量和方法,而接口中只能存在常量和抽象方法。

2.抽象類可以有構造方法,接口沒有構造方法。

接口使用

下面是一個簡單的接口實現電腦使用的例子:

public interface USB {void openDevice();void closeDevice();
}public class Mouse implements USB{public void openDevice(){System.out.println("打開鼠標");}public void closeDevice(){System.out.println("關閉鼠標");}public void click(){System.out.println("鼠標點擊");}
}public class KeyBoard implements USB{@Overridepublic void openDevice() {System.out.println("打開鍵盤");}@Overridepublic void closeDevice() {System.out.println("關閉鍵盤");}public void input(){System.out.println("鍵盤打字");}
}public class test {public static void main(String[] args) {Computer computer = new Computer();computer.open();computer.useUsbDevice(new KeyBoard());computer.useUsbDevice(new Mouse());computer.close();}
}

運行結果:

接口特性

1.接口是一種引用類型,但不能直接new接口的對象:

public class TestUSB {public static void main(String[] args) {USB usb = new USB();//編譯報錯}
}

2.在接口中,所有成員方法默認是抽象方法,沒有具體的實現,由public abstrct修飾,即便不寫

public interface IShape {public static final int a=1;public int b=2;static int c=3;final int d=4;int e=5;//這五種形式本質均相同,由public static final 修飾public abstract void fun1();public void fun2();abstract void fun3();void fun4();//這四種形式本質均相同,由public abstract修飾
}

3.接口中的方法不能再接口中實現,必須由實現接口的類來實現:

public interface USB {void openDevice();void closeDevice(){System.out.println("關閉USB設備");}// 編譯失敗:因為接口中的方式默認為抽象方法
}

4.重寫接口中的方法時,不能使用默認權限修飾符:

public interface USB {void openDevice(); // 默認是public的void closeDevice(); // 默認是public的
}
public class Mouse implements USB {@Overridevoid openDevice() {System.out.println("打開鼠標");}// 編譯報錯,重寫USB中openDevice方法時,不能使用默認修飾符
}

5.在接口中,所有成員變量默認由public static final 修飾,即便不寫

public interface IShape {public static final int a=1;public int b=2;static int c=3;final int d=4;int e=5;//這五種形式本質均相同,由public static final 修飾
}

6.?在接口中,由default關鍵字和static關鍵字修飾的成員方法可以有具體的實現。

default void fun5(){System.out.println("default方法");}static void fun6(){System.out.println("static方法");}

?7.接口中不能有靜態代碼塊和構造方法。

8.接口雖然不是類,但是接口編譯完成后字節碼文件的后綴格式也是.class

實現多個接口

?在Java中,類和類之間不支持多繼承,一個子類只能有一個父類,但是一個類可以實現多個接口,下面通過類來表示一組動物:

public class Animal {protected String name;public Animal(String name) {this.name = name;}
}

另外我們再提供一組接口, 分別表示 "會飛的", "會跑的", "會游泳的"

public interface IRunning {void run();
}public interface ISwiming {void swim();
}public interface IFlying {void fly();
}

下面我們創建幾個具體的動物:

貓,會跑:

public class Cat extends Animal implements IRunning{public Cat(String name) {super(name);}@Overridepublic void run() {System.out.println(this.name + "正在用四條腿跑");}
}

魚,會游泳:

public class Fish extends Animal implements ISwiming{public Fish(String name) {super(name);}@Overridepublic void swim() {System.out.println(this.name + "正在用尾巴游泳");}
}

鴨子,會跑會游泳又會飛:

public class Duck extends Animal implements ISwiming,IFlying,IRunning{public Duck(String name) {super(name);}@Overridepublic void fly() {System.out.println(this.name + "正在用翅膀飛");}@Overridepublic void run() {System.out.println(this.name + "正在用兩條腿跑");}@Overridepublic void swim() {System.out.println(this.name + "正在漂在水上");}
}

上面的代碼展示了Java面向對象編程最常見的用法:一個類繼承一個父類同時實現多個接口。

子類和父類的關系相當于“is a”,而類與接口之間的關系就像是這個類具有XX特性。

接口間的繼承

在Java中,類和類之間是單繼承的,一個類可以實現多個接口,接口與接口之間可以多繼承。即:用接口可以達到多繼承的目的。
接口可以繼承一個接口, 達到復用的效果. 使用 extends 關鍵字。

interface IRunning {void run();
}
interface ISwimming {void swim();
}interface IAmphibious extends IRunning, ISwimming {}class Frog implements IAmphibious {}
//注意Frog類要重寫run()和swim()方法

淺拷貝與深拷貝

Java 中內置了一些很有用的接口, Cloneable 就是其中之一。一個類實現Clonable接口代表這個類是可克隆的。

Object類是Java默認提供的一個類,所有的類都默認繼承自Object類,這個類中存在一個clone方法,調用這個方法可以創建一個對象的拷貝。

觀察下列代碼:

class Animal implements Cloneable {public String name;@Overridepublic Animal clone() {Animal o = null;try {o = (Animal)super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return o;}public Animal(String name){this.name=name;}
}public class test {public static void main(String[] args) {Animal animal = new Animal("大黃");Animal animal2 = animal.clone();System.out.println(animal.name);System.out.println("-----------");System.out.println(animal2.name);}
}

其中try---catch語句使用到了異常的支持,這個后面再講。這段代碼主要內容是用一個Animal類實現了Cloneable接口,在Animal類中重寫了Object類中的clone方法,創建一個與對象相同的Animal對象并返回。代碼輸出結果如下:

可以看出animal2克隆了animal的成員變量name。

淺拷貝

我們在之前代碼的基礎上添加一個Age類,并在Animal類中實例化,在測試類中修改被克隆的對象animal2中的Age類的實例化對象a的成員變量age:

class Age{public int age = 10;
}
class Animal implements Cloneable {public String name;public Age a=new Age();@Overridepublic Animal clone() {Animal o = null;try {o = (Animal)super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return o;}public Animal(String name){this.name=name;}
}public class test {public static void main(String[] args) {Animal animal = new Animal("大黃");Animal animal2 = animal.clone();System.out.println("修改前:"+animal.a.age);System.out.println("修改前:"+animal2.a.age);System.out.println("-----------");animal2.a.age=20;System.out.println("修改后:"+animal.a.age);System.out.println("修改后:"+animal2.a.age);}
}


運行結果如下:

可以看出在單獨修改了animal2中對象的情況下?animal一起被改變了。由此看出aniimal和animal2共同使用對象a,所以這種拷貝被稱為淺拷貝。

深拷貝

class Age implements Cloneable{public int age = 10;@Overridepublic Object clone()throws CloneNotSupportedException {return super.clone();}
}
class Animal implements Cloneable {public String name;public Age a=new Age();@Overrideprotected Object clone()throws CloneNotSupportedException {//return super.clone();Animal tmp = (Animal)super.clone();tmp.a=(Age)this.a.clone();return tmp;}public Animal(String name){this.name=name;}
}public class test {public static void main(String[] args)throws CloneNotSupportedException{Animal animal = new Animal("大黃");Animal animal2 = (Animal)animal.clone();System.out.println("修改前:"+animal.a.age);System.out.println("修改前:"+animal2.a.age);System.out.println("-----------");animal2.a.age=20;System.out.println("修改后:"+animal.a.age);System.out.println("修改后:"+animal2.a.age);}
}

將Age類同樣實現Cloneable接口并重寫clone方法,再在Animal的clone方法中使用Age的clone方法克隆Age對象,這樣就實現了深拷貝,注意方法返回值的類型問題,以及在每個方法后加上

throws CloneNotSupportedException

這段處理異常的代碼。

運行結果:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/915166.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/915166.shtml
英文地址,請注明出處:http://en.pswp.cn/news/915166.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

常用類學習

文章目錄字符串相關的類String的特性String對象的創建字符串相關的類String類與其他結構之間的轉換StringBuffer,StringBuilderStringBuffer類的常用方法JDK8之前日期時間APIjava.lang.System類java.util.Date類java.text.SimpleDateFormat類java.util.Calendar類JDK8中新日期時…

【Python庫包】Gurobi-Optimize (求解 MIP) 安裝

目錄Step1:注冊賬號Step2:獲取Licence另:完整安裝 Gurobi軟件參考本博客簡介Gurobi-Optimizer的安裝(Python 環境)。 Step1:注冊賬號 官網-Gurobi-Optimizer ??注意: Gurobi 是商業軟件&…

【滲透測試】NmapScanHelper 掃描輔助工具

目錄NmapScanHelper 掃描輔助工具一、功能特性二、文件說明三、使用方法1. 安裝依賴macOSUbuntu/DebianCentOS/RHEL2. 配置網段3. 運行掃描基本用法常用端口掃描示例掃描模式特殊環境模式選擇性掃描自定義文件4. 查看結果四、掃描模式說明標準模式特殊環境模式五、支持的 Nmap …

Python爬蟲入門到實戰(1)-requests庫

一.網絡爬蟲庫網絡爬蟲通俗來講就是使用代碼將HTML網頁的內容下載到本地的過程。爬取網頁主要是為了獲取網之間需要中的關鍵信息,例如網頁中的數據、圖片、視頻等。urllib庫:是Python自帶的標準庫,無須下載、安裝即可直接使用。urllib庫中包含大量的爬蟲…

深入理解設計模式之代理模式:原理、實現與應用

在軟件開發中,我們經常需要控制對某些對象的訪問——可能是為了延遲加載、添加額外功能或保護敏感資源。這正是代理模式大顯身手的地方。作為結構型設計模式的重要成員,代理模式在眾多知名框架和系統中扮演著關鍵角色。本文將全面剖析代理模式的方方面面…

VSCode - VSCode 快速跳轉標簽頁

VSCode 快速跳轉標簽頁 1、標簽頁列表快速跳轉 通過快捷鍵 Ctrl Tab 即可快速跳轉標簽頁 # 操作方式先按住 Ctrl 鍵,再按 Tab 鍵,此時,即可打開標簽頁列表(保持 Ctrl 鍵一直按住)然后,再按 Tab 鍵&#xf…

深入理解設計模式:享元模式(Flyweight Pattern)

在軟件開發中,我們經常會遇到需要創建大量相似對象的情況。如果每個對象都獨立存儲所有數據,將會消耗大量內存資源,導致系統性能下降。享元模式(Flyweight Pattern)正是為解決這一問題而生的經典設計模式。本文將深入探…

網絡大提速,RDMA,IB,iWrap

本章第一節介紹的存儲設備方面的創新解決了CPU訪問存儲設備的性能問題。但在實際的業務當中,數據的傳輸除了在節點內部的CPU與存儲設備間外,節點之間也存在數據傳輸的需求。本節我們就介紹在網絡傳輸方面是如何提速的。 在介紹新的網絡技術之前,我們看看傳統網絡是如何傳輸…

【C++】紅黑樹,“紅“與“黑”的較量

各位大佬好,我是落羽!一個堅持不斷學習進步的大學生。 如果您覺得我的文章有所幫助,歡迎多多互三分享交流,一起學習進步! 也歡迎關注我的blog主頁: 落羽的落羽 一、紅黑樹的概念與規則 紅黑樹是一種更加特殊的平衡二…

【愚公系列】《MIoT.VC》001-認識、安裝 MIoT.VC 軟件

??【行業認證權威頭銜】 ? 華為云天團核心成員:特約編輯/云享專家/開發者專家/產品云測專家 ? 開發者社區全滿貫:CSDN博客&商業化雙料專家/阿里云簽約作者/騰訊云內容共創官/掘金&亞馬遜&51CTO頂級博主 ? 技術生態共建先鋒:橫跨鴻蒙、云計算、AI等前沿領域…

git:tag標簽遠程管理

git tag v1:在當前所在分支創建標簽v1git tag -a v2 -m release version:創建一個帶有附注的標簽git tag -d v2:刪除本地標簽git tag:查看標簽git push origin 標簽1 標簽2……:把多個標簽推送到遠程git push origin -…

力扣 hot100 Day49

105. 從前序與中序遍歷序列構造二叉樹 給定兩個整數數組 preorder 和 inorder &#xff0c;其中 preorder 是二叉樹的先序遍歷&#xff0c; inorder 是同一棵樹的中序遍歷&#xff0c;請構造二叉樹并返回其根節點。 //抄的 class Solution { private:unordered_map<int, i…

jvm-sandbox-repeater 錄制和回放

https://github.com/alibaba/jvm-sandbox-repeater/blob/master/docs/user-guide-cn.md 快速錄制自己應用 step0 安裝sandbox和插件到應用服務器 curl -s https://github.com/alibaba/jvm-sandbox-repeater/releases/download/v1.0.0/install-repeater.sh | sh step1 修改repe…

【C++底層剖析】++a vs a++:到底誰是左值,誰是右值?

在 C 編程中&#xff0c;我們經常使用 a 和 a 來實現自增操作。乍一看它們只是“先加還是后加”的語法糖&#xff0c;但你真的理解它們的底層機制、返回值類型和左值右值屬性嗎&#xff1f;1. a 和 a 的基礎區別表達式名稱語義返回值類型左值 / 右值a前置自增先將 a 加 1&#…

【世紀龍科技】汽車故障診斷與排除仿真教學軟件讓課堂更高效安全

隨著汽車產業向智能化、電動化快速轉型&#xff0c;職業院校汽修專業的教學模式正面臨全新挑戰。傳統實車實訓存在成本高、風險大、場景單一等問題&#xff0c;而行業對人才的要求卻越來越高——既需要扎實的理論基礎&#xff0c;又必須具備熟練的故障診斷能力。如何在保證安全…

網絡基礎9:按流負載均衡實驗(等價路由)

實驗eNS拓撲圖&#xff1a;1. 網絡拓撲與 IP 配置AR5&#xff1a;GE0/0/0: 192.168.1.1/24&#xff08;連接 AR6&#xff09;GE0/0/1: 192.168.3.1/24&#xff08;連接 AR8&#xff09;Loopback0: 1.1.1.1/32&#xff08;源地址&#xff09;AR6&#xff1a;GE0/0/0: 192.168.1.…

4G模塊 A7680發送中文短信到手機

命令說明 基礎AT指令 ATi顯示產品的標志信息 ATCIMI查詢IMSI ATCICCID從SIM卡讀取ICCID ATCGSN查詢產品序列號 ATCPIN查詢卡狀態 ATCSQ查詢信號強度 ATCGATT查詢當前PS域狀態 ATCREG查詢GPRS注冊狀態 ATCEREG查詢4G注冊狀態 ATCGPADDR查詢PDP地址 ATCMGF選擇短信格式 ATCMGS發…

深度學習-線性神經網絡

文章目錄線性回歸基本概念隨機梯度下降矢量化加速正態分布和平方損失極大似然估計線性回歸實現從0開始**torch.no_grad()的兩種用途****為什么需要 l.sum().backward()&#xff1f;**調用現成庫softmax回歸圖像數據集從0開始實現softmax利用框架API實現課程學習自李牧老師B站的…

【王樹森推薦系統】推薦系統漲指標的方法04:多樣性

漲指標的方法有哪些&#xff1f; 改進召回模型&#xff0c;添加新的召回模型改進粗排和精排模型提升召回&#xff0c;粗排&#xff0c;精排的多樣性特殊對待新用戶嗎&#xff0c;低活用戶等特殊人群利用關注&#xff0c;轉發&#xff0c;評論這三種交互行為 排序的多樣性 精排多…

1. Spring AI概述

一、前言 Spring AI 是由 Spring 團隊推出的開源項目&#xff0c;旨在為 Java 開發者提供簡潔、一致的 Spring 風格開發體驗&#xff0c;用于構建基于生成式人工智能&#xff08;GenAI&#xff09;和大型語言模型&#xff08;LLM&#xff09;的應用程序。它通過標準化抽象層簡…