接口 | B站Java学习笔记

本文详细介绍了Java接口的定义、语法,包括常量和抽象方法的使用,以及接口如何支持多继承和类的实现。讨论了接口与类的区别,接口在弥补单继承限制中的作用,并通过实例演示了接口在多态中的应用和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 接口是一种引用数据类型,编译之后也是一个class字节码文件。
  2. 接口是完全抽象的。(抽象类是半抽象。)
    或者也可以说,接口是特殊的抽象类
  3. 接口怎么定义?语法是什么?
[修饰符列表] interface 接口名 {
}
  1. 接口支持多继承,一个接口可以继承多个接口。
  2. 接口中只有:常量,抽象方法。
    接口中没有其他内容了。
  3. 接口中所有的元素都是public修饰的。(都是公开的)
  4. 接口中的抽象方法定义时:public abstract修饰符可以省略
  5. 接口中的常量的public static final可以省略
  6. 接口中的方法都是抽象方法,所以接口中的方法不能有方法体
public class Test01 {
	public static void main(String[] args) {
		System.out.println(MyMath.PI);
		//常量能重新赋值吗?
		MyMath.PI = 3.1415928;
		//错误:无法为最终变量PI分配值
	
//定义接口
interface A {
}
//接口支持继承
interface B extends A{
}
//一个接口可以继承多个接口 (直接多继承)
interface C extends A, B {
}
interface MyMath {

	//常量
	public static final double PI = 3.1415926; 
	public abstract int sum(int a, int b); //抽象方法
	
	//接口当中既然都是抽象方法,那么在编写代码的时候,public abstract可以省略吗
	int sum2(int a, int b);
}
	//接口中的方法可以有方法体吗?不能
	//void doSome() {
	}

  1. 类和类之间叫做继承,类和接口之间叫做实现。
    别多想:仍然可以将”实现“看做”继承“
    继承:extends
    实现:implements
  2. 五颗星*******:当一个非抽象的类实现接口的话,必须将接口中所有的抽象方法全部实现(覆盖)

能使用多态吗?可以

public class Test02 {
	public static void main(String[] args) {
		Animal a = new Cat();
		
		Mymath mm = new MyMathImpl();
		//调用接口里面的方法(面向接口编程)
		mm.
	}
}

接口和接口之间支持多继承,那么一个类可以同时实现多个接口吗?
对于计算机来说,一个机箱上有多个接口,一个接口是按键盘的,
一个接口的接鼠标的,一个接口是接电源的,一个接口是接显示器的

重点*****:一个类可以同时实现多个接口
这种机制弥补了java中的哪个缺陷?
java中类和类只支持单继承,实际上单继承是为了简单而出现的,现实世界中存在多继承,java中的接口弥补了单继承带来的缺陷

interface A{
	void m1();
}
interface B{
	void m2();
}
interface C{
	void m3();
}

//实现多个接口,其实就类似于多继承
class D implements A,B,C{
	public void m1(){
	}
	public void m2(){
	}
	public void m3(){
	}
}

public class Test03{
	public static void main(String[] args) {
		//多态
		//此处都是父类型引用指向子类型对象
		A a = new D();
		B b = new D();
		C c = new D();
		
		//这个编译没问题,运行也没问题
		B b2 = (B)a;
		b2.m2();

		M m = new E();
		K k = (K)m;
		//这个编译没问题,运行有问题
	}
}

interface K{
}
interface M{
}
class E implements M{
}

经过测试:接口和接口之间在进行强制类型转换的,没有继承关系,也可以强转。
但是一定要注意,运行时可能会出现ClassCastException异常

接口A和接口B虽然没有继承关系,但是写代码的时候,可以互转,编译器没意见,但是运行时可能出现:ClassCastException异常

之前有一个结论:
无论向上转型还是向下转型,两种类型之间必须要有继承关系,
没有继承关系,编译器会报错。(这句话不适用在接口方面)
最终实际上和之前还是一样,需要加:instanceof运算符进行判断
向下转型养成好习惯,转型之前先if+instanceof进行判断

if(m instanceof K) {
	K k = (K)m;
} //因为m不是K,所以大括号里面的内容没有执行

仅供学习使用,内容版权归B站老师所有。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值