day-1-4-3

接口

需求:需要飞到北京出差

飞机、鸟和超人不能归于一个类属,但是具备有相同的特性:会飞的。所以引入了一个新概念叫做接 口,可以用于规范实现接口的类中必须实现接口中抽象方法。接口可以理解为一种契约 使用关键字interface定义接口

public interface 会飞的 {
	public void 起飞();
	public void 巡航飞行();
	public void 降落();
}

接口不能直接使用,必须有对应的实现类

public class 飞机类 implements 会飞的 { //共性是通过实现接口来表示的
	private String name; //名称,这是类属的属性,这里可以定义字节类的成员,和接口无关,如果当前类不是抽象类,则必须实现接口中的所有抽象方法
	@Override
	public void 起飞() {
		System.out.println("使劲的跑,一抬头就飞起来了");
	}
	@Override
	public void 巡航飞行() {
		System.out.println("使劲的烧油...");
	}
	@Override
	public void 降落() {
		System.out.println("我对准...");
	}
}

通过接口定义变量,使用具体类的实例,进行调用

会飞的 obj = new 飞机类();
obj.起飞();
obj.巡航飞行();
obj.降落();

引入接口的目的在于隔离实现

public void 出差(飞机 obj){}
这种写法当前类和飞机是耦合的,如果需要坐超人出差,则必须修改源代码
public void 出差(会飞的 obj){}
当前类只是和接口耦合,任何实现了接口的对象都可以作为参数进行传入

使用接口而不是使用具体的类,则可以实现在实现接口的多个具体实现类之间进行更换,例如定义出超人类

什么是接口

在Java中不直接支持多继承,因为会出现调用的不确定性,所以Java将多继承机制进行改良,在Java中 变成了多实现。一个类可以实现多个接口,一个接口可以继承多个接口

interface IA{}
interface IB{}
interface IC extends IA,IB{} 正确的,其中IC中的方法等于IA+IB

class A implements IA,IB{}
IA a=new A();
IB b=new A();
  • 接口是一种特殊的抽象类,接口只能被abstract或者public修饰

  • 没有构造器方法

public interface IA{
	public IA(){} //语法报错
}
  • 可以包含抽象方法,也可以没有抽象方法
interface IA1 {
}// 这个接口中没有包含任何抽象方法

class A1Impl implements IA1 {
}
  • 接口中的方法只能被public、default、abstract、static修饰
    • 一般情况下接口中只定义抽象方法
    • 定义的方法默认为公开的抽象方法
接口允许多重继承

一个类在继承另一个类的同时,还可以实现多个接口

interface IA1{
	public void p1();
}
interface IA2{
	public void p2();
}
interface IC extends IA1,IA2{
	public void p3();
}//可以继承多个父接口,此时IC中实际有3个抽象方法
类是单根继承,不允许继承多个父类

允许一个类实现多个接口,但是每个接口的抽象方法都必须提供实现,否则是抽象类。提供的实现也可以 是继承

public class A1{
	public void p1(){}
}
public class A2 extends A1 implements IA1,IA2{
	public void p2(){}
}
public abstract class A3 extends A1 implements IA1,IA2{}//因为p2方法没有实现

接口的出现避免了单继承的局限性,这样定义C接口则拥有A+B的所有定义,可以使用A和B接口以及父 类D声明变量类型,直接new T。但是约束时,用谁声明变量编译器系统识别就是谁这种类型,也就意味 只能调用识别类型中的方法,不能调用其他方法

interface A{
	public void p1();
}
interface B{
	public void p2();
}
interface C extends A,B{}
class D{
	public void abc(){}
}
class T extends D implements C{
	public void p1(){}
	public void p2(){}
}
D d=new T();这里只能调用abc方法,如果使用其他方法则需要进行类型转换
A a=new T();这里只能调用A接口中声明的方法p1
B b=new T();这里只能调用B接口中声明的方法p2
声明接口的语法

访问修饰符 interface 接口名{ } 一般建议接口名称使用形容词

  • 接口中没有属性,只能定义常量,它提供一些常量,实现它的类可以共享这些常量
  • 接口可以给出访问控制符,用public修饰的是公共接口,到处可见;如果定义接口没有范围限定 词,则只能在同包中访问
接口的特殊特征
  • 一个类只能有一个父类!

  • 一个类可以实现多个接口!

  • 一个接口可以继承多个接口

接口的作用
  • 统一访问
  • 解耦 通过接口可以隔离具体实现
    • 解耦就是 在使用者 和 实现者 之间没有关系。 无论实现者如何改变实现,对于使用者使用不会变化

接口和抽象类的异同点[3星]

  • 相同点:都是不断向上抽取而来的

  • 不同点:

    • 抽象类需要被继承,而且只能单继承
    • 接口需要被实现,而且可以多实现
  • 抽象类中可以定义抽象方法和非抽象方法,子类继承后可以直接使用非抽象方法

  • 接口中可以定义抽象方法和default方法,抽象方法必须由子类去提供实现;JDK1.8+中允许接口中 的方法有默认实现,实现类中可以直接使用默认实现,允许覆盖定义

  • 抽象类的继承是is a关系,在定义该体系的基本共性内容

  • 接口的实现是like a关系,在定义体系额外功能

  • 接口中只能定义常量,而且必须被初始化,抽象类中可以定义属性,允许在声明时直接初始化,也 可以不初始化,同时允许定义常量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值