抽象类和接口(2)

1、接口

1、接口的概念

接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。 在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。

2、语法规则

接口的定义格式与定义类的格式基本相同,将class关键字换成 interface 关键字,就定义了一个接口。

public interface 接口名称{
public abstract void method1();
public void method2();
abstract void method3();
void method4();
}

1. 创建接口时, 接口的命名一般以大写字母 I 开头。

2. 接口的命名一般使用 "形容词" 词性的单词。

3. 阿里编码规范中约定, 接口中的方法和属性不要加任何修饰符号, 保持代码的简洁性。

3、接口使用

接口不能直接使用,必须要有一个“实现类”来“实现”该接口,实现接口中的所有抽象方法。

public class 类名称 implements 接口名称 {
//····
}

1、接口当中的成员默认是被public static final 修饰的。

2、接口当中的方法默认是被public abstract 修饰的。

3、如果接口当中的方法被default 修饰,那么可以有具体的实现。

4、如果接口当中的方法被static 修饰,那么可以有具体的实现。

5、接口是不可以进行实例化的。

6、类与接口之间可以使用关键字implements 来实现接口。

7、一个接口对应一个字节码文件。

8、如果一个类不想实现接口当中的方法,此时这个类就可以被定义为抽象类,但是这个抽象类如果被继承,就得实现所有没有被实现的方法。

4、接口特性

1、接口类型是一种引用类型,但是不能直接new接口对象。

2、接口中每一个方法都是public的抽象方法,即接口中的方法会被隐式的指定为public abstract 。

3、接口中的方法是不能在接口中实现的,只能由实现接口的类来实现。

public interface USB {
void openDevice();
// 编译失败:因为接口中的方式默认为抽象方法
// Error:(5, 23) java: 接口抽象方法不能带有主体
void closeDevice(){
System.out.println("关闭USB设备");
}
}

4、重写接口中的方法时,不能使用默认的访问权限。

5、接口中可以含有变量,但是接口中的变量会被隐式的指定为pnblic static final 变量。

6、接口中不能有静态代码块和构造方法。

7. 接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是.class。

8. 如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类。

5、实现多个接口

在Java中不支持多继承,但是一个类可以实现多个接口。

class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
}
interface IFlying {
void fly();
}
interface IRunning {
void run();
}
interface ISwimming {
void swim();
}
class Duck extends Animal implements IRunning, ISwimming, IFlying {
public Duck(String name) {
super(name);
}
@Override
public void fly() {
System.out.println(this.name + "正在用翅膀飞");
}
@Override
public void run() {
System.out.println(this.name + "正在用两条腿跑");
}
@Override
public void swim() {
System.out.println(this.name + "正在漂在水上");
}
}

一个类实现多个接口时,每个接口中的抽象方法都要实现,否则类必须设置为抽象类。

IDEA 中使用 ctrl + i 快速实现接口。

编程中最常见的做法:一个类继承一个父类, 同时实现多种接口。

6、接口间的继承

在Java中,类和类之间是单继承的,一个类可以实现多个接口,接口与接口之间可以多继承。

接口可以继承一个接口, 使用 extends 关键字。

interface IRunning {
void run();
}
interface ISwimming {
void swim();
}
// 两栖的动物, 既能跑, 也能游
interface IAmphibious extends IRunning, ISwimming {
}
class Frog implements IAmphibious {
...
}

7、抽象类和接口的区别

核心区别: 抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用。, 而接口中 不能包含普通方法, 子类必须重写所有的抽象方法。

如之前写的 Animal 例子. 此处的 Animal 中包含一个 name 这样的属性, 这个属性在任何子类中都是存在的. 因此此 处的 Animal 只能作为一个抽象类, 而不应该成为一个接口。

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

抽象类存在的意义是为了让编译器更好的校验, 像 Animal 这样的类我们并不会直接使用, 而是使用它的子类. 万一不小心创建了 Animal 的实例, 编译器会及时提醒我们.

2、Object类

Object是Java默认提供的一个类。Java里面除了Object类,所有的类都是存在继承关系的。默认会继承Object父 类。即所有类的对象都可以使用Object的引用进行接收。

在开发之中,Object类是参数的最高统一类型。但是Object类也存在有定义好的一些方法。

1、获取对象信息

如果要打印对象中的内容,可以直接重写Object类中的toString()方法,

// Object类中的toString()方法实现:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

2、对象比较的equals方法

在Java中,==进行比较时: 如果==左右两侧是基本类型变量,比较的是变量中值是否相同 如果==左右两侧是引用类型变量,比较的是引用变量地址是否相同 如果要比较对象中内容,必须重写Object中的equals方法,因为equals方法默认也是按照地址比较的。

// Object类中的equals方法
public boolean equals(Object obj) {
return (this == obj); // 使用引用中的地址直接来进行比较
}
class Person{
private String name ;
private int age ;
public Person(String name, int age) {
this.age = age ;
this.name = name ;
}
}
public class Test {
public static void main(String[] args) {
Person p1 = new Person("gaobo", 20) ;
Person p2 = new Person("gaobo", 20) ;
int a = 10;
int b = 10;
System.out.println(a == b); // 输出true
System.out.println(p1 == p2); // 输出false
System.out.println(p1.equals(p2)); // 输出false
}
}

重写equals方法

class Person{
...
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false ;
}
if(this == obj) {
return true ;
}
// 不是Person类对象
if (!(obj instanceof Person)) {
return false ;
}
Person person = (Person) obj ; // 向下转型,比较属性值
return this.name.equals(person.name) && this.age==person.age ;
}
}

比较对象中内容是否相同的时候,一定要重写equals方法。

3、hashcode方法

hashcode算了一个具体的对象位置。

我们认为两个名字相同,年龄相同的对象,将存储在同一个位置。

重写hashcode方法:

class Person {
public String name;
public int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
public class TestDemo4 {
public static void main(String[] args) {
Person per1 = new Person("gaobo", 20) ;
Person per2 = new Person("gaobo", 20) ;
System.out.println(per1.hashCode());
System.out.println(per2.hashCode());
}
}
//执行结果
460141958
460141958

1、hashcode方法用来确定对象在内存中存储的位置是否相同。

2、事实上hashCode() 在散列表中才有用,在其它情况下没用。在散列表中hashCode() 的作用是获取对象的 散列码,进而确定该对象在散列表中的位置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/653433.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python考试练习题---day1

1.计算2的n次幂结果的后3位 获得用户输入的一个数字N,计算并输出2的N次幂结果的后3位。 【输出样例】-----因为2的10次方等于1024 输入10输出024 ninput() print(str(2**eval(n))[-3:]) 2.分割四位正整数 例1: 编写程序,提示用户从键盘…

2、python环境的安装-mac系统下

打开官网,downloads下边有macOS,点击: 选择最新版本,点击,进入下边的页面,一直往下滑,看到files中有个macOS的版本,点击下载 点击下载后是pkg的安装包,点击安装。 一步步…

350种类型、10W+量级的API,企业应该怎么管?

忽如一夜春风来,万物皆可API。 在互联网时代,API无处不在:企业对外开放的数据、服务和业务能力,以API的形式提供给合作方;企业内部应用与应用、App与App之间的通信,通过API进行;甚至应用内部的…

机器视觉HALCON:3.图像获取,运算,率噪,滤波(边缘),锐化

目录 图像获取生成单通道图像图像运算加法运算减法运算乘法运算除法 仿射变换图像平滑(噪点处理)高斯滤波均值滤波中值滤波多图像均值 边缘滤波索贝尔滤波凯尼滤波 图像锐化索贝尔锐化拉普拉斯锐化高通滤波锐化几种锐化方式对比 图像获取 用到的函数&…

液氮罐内部会污染吗

液氮罐是一种常见的存储液态氮的设备,广泛应用于科研、生物医药、食品冷冻等领域。但是,人们对于液氮罐内部是否会产生污染一直存在疑问。 我们来看液氮罐内部可能的污染源。液氮罐内部主要存在以下几种潜在的污染来源:气体污染、杂质污染、…

MySQL数据处理增删改

数据处理增删改DML 由于约束,以下操作都有可能执行失败(后面讲约束) 插入数据 INSERT 基础添加:VALUES 值的顺序必须和表中字段顺序相同 INSERT INTO class VALUES(1,王小,10); 向指定字段添加: 值的顺序和指定…

使用canarytokens进行入侵检测

canarytokens 基本概念 canarytokens是一种用于识别网络入侵的工具。它们是一种虚拟的“蜜罐”,可以在网络上放置,当有人尝试访问它们时,可以立即触发警报,以便及时发现潜在的安全威胁。这些token可以是各种形式,可以…

工业触摸屏一般用哪种

工业触摸屏一般使用以下几种类型:1.电阻式触摸屏:电阻式触摸屏是最常见和常用的工业触摸屏类型之一。它由两层导电层组成,当屏幕上的物体接触到触摸屏时,两个导电层之间会发生电阻变化,触摸点的坐标信息可以通过测量电…

不仅能逃生,更能自动灭火!神奇的全氟己酮灭火毯的原理是什么?

很多朋友对灭火毯的印象,还停留在火灾发生时披覆在身上逃生时使用,可以隔离火源。近年来兴起的全氟己酮自动灭火毯可以说大为颠覆大家的想法,这是一条真的可以自动灭火的神奇灭火毯!为什么能做到这一点?全氟己酮灭火毯…

黑马聚合的分类及实现

1、什么是聚合? 聚合是对文档数据的统计、分析、计算 聚合的常见种类有哪些? 桶(Bucket)聚合:用来对文档做分组 TermAggregation:按照文档字段值分组 Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组 度量(…

LVM与磁盘配额09

一、LVM 1、lvm概述 lvm (logical volume manager ):逻辑卷管理 linux系统下对硬盘分区的一种管理机制。 场景:lvm机制特别适合于管理大存储设备。 作用:可以动态的对硬盘进行扩容 。 逻辑上的磁盘,概…

IP协议说明

文章目录 前言一、IP协议的简介二、IP数据报1.IP 数据报结构2.IP 数据报的分片解析3.IP 数据报的分片重装 三、IP 数据报的输出四、IP 数据报的输入 前言 IP 指网际互连协议, Internet Protocol 的缩写,是 TCP/IP 体系中的网络层协议。设计 IP 的目的是…

QGis3.34.5工具软件保存样式,软件无反应问题

在使用QGis软件保存SLD样式的时候,每次保存样式,软件都进入无反应状态,导致无法生成样式文件 百度中多次查询问题点,终未能在在3.34.5这个版本上解决问题。 考虑到可能是软件本身问题,于是删除了3.34.5这个版本&#x…

Java面试八股之自旋是什么意思

Java中的自旋是什么意思 自旋是多线程编程中的一种同步机制,尤其在Java中与锁的实现密切相关。当一个线程尝试获取某个锁(如内置锁或显式锁)时,如果锁已被其他线程持有,通常的做法是将该线程置于阻塞状态,…

基于遗传优化的Sugeno型模糊控制器设计matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于遗传优化的Sugeno型模糊控制器设计matlab仿真,通过遗传优化算法优化模糊控制器的隶属函数参数,从而获得较优的控制效果。 2.系统仿真结果 3.核心程序与模型 …

Redis面试题深度解析

1、我看你做的项目中,都用到了redis,你在最近的项目中哪些场景使用了redis呢? 2、缓存穿透 布隆过滤器的误判现象 Redisson和Guava都对布隆过滤器进行了实现 3、缓存击穿 互斥锁,就是一个线程来修改,并占据了锁,另外其…

cgicc开发(文件上传)

//cgicc文件上传封装 void UploadSoftware() {// 初始化CGIC环境Cgicc cgi;// 获取上传的文件file_iterator fileIter cgi.getFile("button_browse"); //from表单中,输入为文件属性(typefile)的name属性值if (fileIter cgi.getFiles().end()){ #if (DEBUG true)co…

【在Postman中,如果后端返回的是String类型的数据但不是JSON格式,报错】

在Postman中,如果后端返回的是String类型的数据但不是JSON格式 问题描述解决办法 postman后端返回的String数据,不是json,怎么设置结果的接收? 问题描述 在postman中测试接口,报错Error:Abort,或者显示返回数据校验失…

数据真实性与经济收益的矛盾:第三方检测何去何从|中联环保圈

在当今的市场化竞争环境中,第三方检测公司在环保行业中处于较为底端的位置。其多数检测业务依赖于第三方技术服务单位的委托,然而在委托过程中,往往面临着报告真实性和收款的矛盾。一旦第三方检测公司负责人在数据真实性和经济收益矛盾中取舍…

基于Freertos的工训机器人

一. 工训机器人 V1 1. 实物 将自制的F4开发板放置车底板下方,节省上方空间,且能保证布线方便整齐。 2. SW仿真 使用SolidWorks进行仿真,且绘制3D打印件。 工训仿真 3.3D打印爪测试 机械爪测试 二. 工训机器人 V2 1. 实物 工训机器人V2不同于…