您现在的位置是:首页 > 正文

“接口”的定义及其与“抽象类”的区别

2024-02-01 01:17:26阅读 2

我们知道一个有抽象方法的类是抽象类,而当一个类中全是抽象方法时,就可以定义为接口(interface)

  • 接口命名通常以“I”开头;
  • 接口中的方法默认有public abstract(所以可以省略);
  • 接口中的变量默认有public static final(静态常量),因此可以通过接口名直接调用,例如:
public interface IMammal{
	public abstract void move();
	void sleep();				//默认有public abstract

	int AGE = 20;				//常量通常用大写字母
}
public class Test{
	public static void main(String[] args) {
		System.out.println(IMammal.AGE);	//输出结果:20
	}
}
  • 不同于“类”与“类”之间继承时为单继承一个接口可以继承多个其他接口
  • 抽象类虽不能创建对象,但可以构造方法,而接口中两者都不可以,例如:
interface IA{}
interface IB{}
public interface IMammal extends IA,IB{	//继承多个其他接口
	/*
	public IMammal(){}					//这是错的×,接口中不可以构造方法
	*/
}
  • 同时接口中也不能定义具体方法,
    【但从JDK8开始(之前的都不行),可以声明具体方法,但必须为staticdefault
public interface IMammal {
	/*
	public void bite(){
		System.out.println("正在咬...");	//这是错的×
	}
	*/
	public static void eat(){
		System.out.println("正在吃...");
	}
	public default void play(){
		System.out.println("正在嬉戏...");
	}
}
  • 一个“类”继承“接口”时,要用implements,而不能用extends;
  • 和接口的继承相同,一个类也可以继承多个接口;
  • 一个类如果不实现接口中的所有抽象方法(即重写),则该类必须为抽象类;
  • 一个类继承接口的同时,也就继承了接口中的常量,
    例如:上面定义过的静态常量AGE,当一个类继承该接口时,也就可以通过该类的类名直接调用;
public class Cat implements IMammal,IA{
	@Override
	public void move(){
		System.out.println("正在屋顶上飞奔...");
	}
	@Override
	public void sleep(){
		System.out.println("正在蜷缩着睡觉...");
	}
}
public class Test{
	public static void main(String[] args) {
		System.out.println(Cat.AGE);	//输出结果:20
	}
} 

需要注意的两点:

  • 接口只能继承父接口(一个或多个),不能继承类(包括普通类和抽象类);
  • 接口继承接口、类继承类 用extends,类继承接口 用implements

总结一下抽象类与接口的区别

抽象类 接口
关键字 abstract interface
成员变量 可包含任意合法成员变量 只包含静态常量(默认public static final)
构造方法 有构造方法 无构造方法
方法 可定义任意合法的方法 JDK8之后(之前不可)可以通过static或default修饰声明具体方法
继承 “类”与“类”之间只能是单继承(用extends),但一个类可以继承多个接口(用implements) 一个接口可以继承多个父接口(用extends),但不能继承“类”

网站文章

  • websocket 的创建与关闭

    websocket 的创建与关闭。

    2024-02-01 01:17:18
  • C#读Visio模型数据

    C#读Visio模型数据

    第一步:安装Visio安装相应版本的Visio(以64位为例),在安装过程中经常遇到下面的问题解决方法:按“win+R”快捷键,打开“运行”,输入“regedit”,打开注册表,找到【HKEY_CLASSES_ROOT】àInstalleràProducts备份注册表,然后将上面Office 16 Click-to-run Extensiblity Component删除,然后...

    2024-02-01 01:17:11
  • [学习记录] Redis 5. 事务和锁机制,秒杀案例 Demo

    [学习记录] Redis 5. 事务和锁机制,秒杀案例 Demo

    [学习记录] Redis 5. 事务和锁机制,秒杀案例 Demo

    2024-02-01 01:17:07
  • P5735 【深基7.例1】距离函数

    P5735 【深基7.例1】距离函数给出平面坐标上不在一条直线上三个点坐标 (x1,y1),(x2,y2),(x3,y3)(x_1,y_1),(x_2,y_2),(x_3,y_3)(x1,y1),(x...

    2024-02-01 01:16:37
  • C# - JSON详解

    C# - JSON详解

    最近在做微信开发时用到了一些json的问题,就是把微信返回回来的一些json数据做一些处理,但是之前json掌握的不好,浪费了好多时间在查找一些json有关的转换问题,我所知道的方法只有把json序列化和反序列化一下,但是太麻烦了我觉得,所以就在找一些更简单又方便使用的方法。也许这个会有用吧,所以先放到这以后能用到的。原文出处:http://www.cnblogs.com/mcgra...

    2024-02-01 01:16:29
  • yum安装mongodb报错

    yum安装mongodb报错

    今天在尝试yum安装mongodb时,发现了问题:这是因为你以前用的是CENTOS现在是redhat 红帽的yum安装软件的时候要验证的看是不是红帽的软件,是红帽的软件可以安装不是就失败.因此,我们需要将gpgcheck=1改成gpgcheck=0即可。gpgcheck=1表示需要验证,0表示不需要验证。成功!...

    2024-02-01 01:16:13
  • 用nginx反向代理Jenkins遇到的testForReverseProxySetup问题

    用nginx反向代理Jenkins遇到的testForReverseProxySetup问题

    又一次开始了Jenkins征程,其实以前我就遇到了这个问题,如图 你说你报这个错误鬼知道是为什么,当然了,我们也不能太苛求,Jenkins怎么可能知道具体是什么问题呢?算啦,我们自己去看Jenkins的日志吧,我发现 WARNING: http://jenkins.tangxuyang.cn/manage vs. http: 然后又结合chrome的F12,如下 就是这个请求没有正...

    2024-02-01 01:15:44
  • 为什么在vue3中每个页面都需要引用ref,reactive的问题

    为什么在vue3中每个页面都需要引用ref,reactive的问题

    在 Vue 3 中,对响应式数据的追踪和更新机制进行了优化,使得响应式数据的更新更加高效。,而不是自动引入,是因为 Vue 3 中引入了 Tree Shaking 机制,这种机制可以对无用的代码进行剪...

    2024-02-01 01:15:37
  • 使用 kind 1 分钟启动一个本地 k8s 开发集群

    使用 kind 1 分钟启动一个本地 k8s 开发集群

    使用 kind 1 分钟启动一个本地 k8s 开发集群kind 简介Github 地址:https://github.com/kubernetes-sigs/kindkind 是一个快速启动 kube...

    2024-02-01 01:15:33
  • 【python】时间处理函数以及文件操作

    1. 时间函数模块(库)-使用流程:先导入,再引用1:导入 方式一:import 模块名 引用:模块名.函数名() 方式二:from 模块名 import 函数名/变量/类 ...

    2024-02-01 01:15:05