当前位置: 首页 > news >正文

Java:抽象类和接口

一.抽象类

1.抽象类概念和语法

⨀概念:

在面向对象的概念中,所有的对象都是通过类来描绘的,但是并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类

⨀语法: 

在Java中,一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用给出具体的实现体

⨀现在我们来用一个实例,来展示一下抽象类的概念和语法形式

c310de6e9eae4fada0e452701abd4ce9.png

2.抽象类特性

⨀抽象类不能直接实例化对象

e4208f75b9e249509e4d5d4dcf75b3e0.png

⨀抽象方法不能是 private 的 

626232205ee14f9cba6ae913b625c55f.png

被private所修饰的方法在子类中是不可见的,这就导致了我们不能重写该方法 

⨀抽象方法不能被final和static修饰

041e1834224f434b9eaccfc17ddb58a6.png

因为抽象方法要被子类重写,但是static和final关键字会阻止方法的重写。

⨀抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要使用 abstract 修饰 

如果我们不重写抽象方法就会报错

190552c8975a461f8540ea6100552049.png

a3abc978b26746b9a11096625f848d69.png

如果我们不想在子类中重写抽象方法,我们可以将子类也修饰为抽象方法,但是记住,出来混迟早是要还的,在之后我们需要在Circle的子类下重写Shape和Circle的所有抽象方法

11ea8405510c4db780914216dba27ab0.png

a0c8397b9c7045bda3bda324870c2894.png

⨀抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类 

ab594443faea48079eb647fdbf787d85.png

9a1e0d2b62174702b6cad51c4f4802a7.png

⨀抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量 

f572ed0482d64bcbaacd9955102eec94.png

3.抽象类的作用

抽象类本身是不能被实例化, 要想使用, 只能创建该抽象类的子类,然后让子类重写抽象类中的抽象方法,这时我们发现其实我们的普通类也完全可以实现这些功能但是为什么要用抽象类呢?这其实是因为使用抽象类的时候我们可以多一层校验,因为想这样的一类代码实际的完成不应是我们的父类完成,而是由我们的子类来进行实现,如果我们不用抽象类在编译时时不会报错的,但是当我们是抽象类时,一旦我们进行实例化的时候,就会提醒我们错误,这样可以使我们尽早发现问题。

二.接口

1.接口的概念和语法

⨀概念:

接口在我们的生活中比比皆是,例如我们的机箱和笔记本上的USB口,插座上的插座口等等。这些都是我们生活中的接口,但是接口之间也是有着一定的标准的,例如我们的插座口,我们以三个插头接口为例,只要我的符合三个插头接口标准,尽管是不同的家电,也都能给设备进行充电,所以我们可以把接口看成公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。

所以在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型

⨀语法 :

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

⨀定义一个C接口 :

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

 d08a57e065b64e43936d7920a190475e.png

⨀注意:在接口中定义的属性默认是 public static final 修饰的,方法默认是 public abstract 修饰的,但是我们默认不写,直接写类型+名字/方法名即可。

3d563d76aa3d4d52a225035a23a15246.png

⨀注意:由于方法默认是由 abstract 所修饰的,所以在接口中方法全都为抽象方法,没有方法体 

2.接口使用

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

注意:接口与类之间是实现关系。所以这时我们又要引入一个新的关键字implements

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

b3147934956043458e9bb488f86e3299.png

3.接口特性

⨀接口类型是一种引用类型,但是不能直接new接口的对象 

836883ea66f147ada3dd3dfad5c0b425.png

⨀接口中每一个方法都是public的抽象方法, 即接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错) 

⨀接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量

这两个在上文我们已经提到了

3d563d76aa3d4d52a225035a23a15246.png

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

这个在上文也提到到了因为方法默认是被public abstract 所修饰的,是抽象的方法,是没有方法体的,所以方法不能在接口中实现,只能由实现接口的类进行重写。

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

接口中方法默认是public 修饰的,而在重写是访问限定符不能比原方法严格,范围只能大于等于原方法。而默认访问权限的范围是比public要小的所以不能是用默认访问权限,同时我们也知道public修饰符的范围是最大的,所以我们接口的重写修饰符只能是public.

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

22eaa2f502004ab8a0342b5c0bfc9335.png

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

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

⨀jdk8中:接口中还可以包含default方法

4.实现多个接口

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

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

 

5.接口间的继承

接口支持多继承,即一个接口可以继承多个接口

e6387962b0df49dbb3e44fb951e16e3a.png

6.接口的使用

如果我们想要进行对象之间的比大小我们该怎么进行呢?,我们先来看一段代码

像是图片上的两个对象我们如果使用正常的方式去对比,我们其实是比不了的,因为我们不知道是用年龄比还是去用姓名去比,所以我们根本不能进行比较。

如果我们想要进行比较的话,我们就要用到类去实现 Comparable 接口, 并实现其中的 compareTo 方法 

 注意:我们必须要实现Comparable 接口,并且重写compareTo 方法 让我们知道根据什么进行比较的,才能进行对象的比较。

这时我们又想到了一个于比较相关的问题排序,我们知道在数组中我们可以使用Arrays.sort();方法进行排序

如果我们这时我们想要把在数组里的对象进行排序我们该怎么办呢?

这时我们就要将两方法进行联合使用,实现Comparable 接口,并且重写compareTo 方法和toString()方法,这后再利用sort进行排序 

7.Clonable 接口和深拷贝

Java 中内置了一些很有用的接口, Clonable 就是其中之一Object 类中存在一个 clone 方法, 调用这个方法可以创建一个对象的 “拷贝”. 但是要想合法调用 clone 方法, 必须要先实现 Clonable 接口, 否则就会抛出 CloneNotSupportedException 异常.

我们发现这里出现了错误,这是因为我们的clone的返回类型为Object,我们要进行强制类型转换

 但是我们转换完之后,发现问题还是存在

 这时我们可以在main方法后加上一个throws CloneNotSupportedException就能解决这个异常

但是如果这时我们想要打印我们所克隆到person2中的name,我们发现还是出现了错误

 如果想要解决这个方法就要我们进行接口的实现,即Cloneable接口

深拷贝和浅拷贝

浅拷贝:

 

深拷贝:

 

 

8.抽象类和接口的区别

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

三.Object类

1.Object类的介绍

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

2.获取对象信息

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

3.对象比较的方法equals

在Java中,==进行比较时:

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

 

 

4.hashcode方法

hashCode()这个方法,他能帮我们算一个具体的对象位置,然后调用Integer.toHexString()方法,将这个地址以16进制输出。

 我们会认为,当两个方法的对象的成员都相同的时候,认为它们在同一个位置上,如果不重写,当我们使用hashCode的时候,就输出的不一样,比如:

如果我们想要让他们相同的话可以去进行重写 


 好了今天的分享就到这里了,我们下一篇见!


http://www.mrgr.cn/news/57273.html

相关文章:

  • 上拉电阻和下拉电阻在电路中的作用(一)
  • 入门介绍(一):脉冲神经网络(SNN)
  • MySQL-视图 (ಥ_ಥ)
  • 如何从模块内部运行 Pytest
  • 使用 Spring 框架构建 MVC 应用程序:初学者教程
  • c语言字符串函数strstr,strtok,strerror
  • Linux内核 -- `dynamic_debug` 使用指南
  • ELRS遥控器与接收机WIFI对频
  • python-----函数详解(一)
  • 组件可控个性化生成新方法MagicTailor:生成过程中可以自由地定制ID
  • libaom 编解码项目编码接口文件介绍
  • MySQL笔试面试题之AI答(2)
  • Docker 基础入门
  • 破四元!一区飞蛾扑火算法+时序卷积+双向单元+注意力机制!MFO-TCN-BiGRU-Attention多变量时间序列预测
  • MySQL优化手段有哪些
  • 好看的动态屏保来了 今年不能错过的视觉盛宴
  • pytorh学习笔记——cifar10(五)ResNet网络结构
  • 万能接口PCIE
  • Linux中Kconfig结构分析
  • 【电子通识】四线电阻屏原理
  • 【高等数学学习记录】无穷小的比较
  • 16天自制CppServer-day02
  • 带权并查集注意事项
  • 华帝携手抖音头部达人,金牌导演李力持量身打造厨电定制微短剧
  • Java避坑案例 - 接口设计_版本控制策略
  • solidworks管理员运行install.bat提示[sC]0penService 失败 5:拒绝访问。请按任意键继续...