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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;的应用程序。它通过标准化抽象层简…