接口说明

1、有时必须从几个类中派生出一个子类,继承它们所有的属性和方法。但是,Java不支持多重继承。有了接口,就可以得到多重继承的效果。

例如:电视机,既能作为传统的电视节目接收播放器,又能作为录像视频播放器,还能作为上网的显示器。

      电脑也是一样

2、有时必须从几个类中抽取出一些共同的行为特征,而它们之间又没有is-a的关系,仅仅是具有相同的行为特征而已。

例如:鼠标、键盘、打印机、扫描仪、摄像头、充电器、MP3机、手机、数码相机、移动硬盘等都支持USB连接。



所以,接口就是一个规范,一个标准。

之前我们使用继承描述is-a的关系。例如:动物、哺乳动物、爬行动物、人等

现在如果要描述:飞机、子弹、导弹、石头、热气球、风筝等它们之间的关系呢

它们具有共同的行为:可以飞

interface Flyable{
	long MAX_SPEED = 7900;//7.9千米/秒,超过这个速度,就变成卫星
	long MIX_SPEED = 1;
	void fly();
}
class Plane implements Flyable{

	public void fly() {
		System.out.println("飞机靠发动机飞行");
	}
}
class Kite implements Flyable{

	public void fly() {
		System.out.println("风筝靠风飞行");
	}
}
class FireBalloon implements Flyable{

	public void fly() {
		System.out.println("热气球靠热空气飞行");
	}
}
interface Attack{
	void attack();
}
class Bullet implements Flyable,Attack{
	public void fly(){
		System.out.println("靠助推器飞行");
	}

	public void attack() {
		System.out.println("子弹可以攻击");
	}
}

接口和类是平级,或者可以理解为一种特殊的类

从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。

如何声明接口

用interface关键字来定义

格式:访问控制修饰符  interface 接口名{}

如何实现接口

用implements关键字

格式:class 类名 implements 接口名{}

接口的特点

接口(interface)是抽象方法和常量值的定义的集合。
接口中的所有成员变量都默认是由public static final修饰的。
接口中的所有方法都默认是由public abstract修饰的。
2、接口不能实例化
3、接口没有构造器
4、接口就是用来被实现的,当类实现了接口时,该类需要实现接口所有的抽象方法,否则该类也得是抽象类,不然编译报错。
5、一个类只能继承一个父类,但可以同时实现多个接口
访问控制修饰符  class 类名  extends 父类  implements 接口1,接口2。。。{   
//...
}
6、一个接口可以继承其他一个或多个接口
interface 接口 extends 其他接口1,接口2 。。。{
}
7、与继承关系类似,接口与实现类之间存在多态性
public static void main(String[] args) {
		Plane p = new Plane();//本态引用
		Flyable fp = p;//多态引用
		Flyable fk = new Kite();//多态引用
		Flyable fs = new Bullet();//多态引用 ,子弹是Flyable接口的实现类
		Attack a = new Bullet();//多态引用,子弹是攻击性武器的实现类
		Object o = new Bullet();//多态引用,子弹是Object类的子类
	}

为什么要定义接口?

接口就是比“抽象类”还“抽象”的“抽象类”,可以更加规范的对子类进行约束。全面的专业的实现了:规范和具体实现的分离。

接口就是规范,定义的是一组规则,体现了现实世界中“如果你是/要...则必须能...”的思想。继承是一个"是不是"的关系,而接口实现
则是 "能不能"的关系。

接口的本质是契约,标准,规范,就像我们的法律一样。制定好后大家都要遵守。

项目的具体需求是多变的,我们必须以不变应万变才能从容开发,此处的“不变”就是“规范”。因此,我们开发项目往往都是面向接口编程!

小结

1、类与接口的关系:

(1)类与类之间是继承,而且是单继承

(2)类与接口之间是实现,可以多实现

(3)接口与接口之间是继承,可以多继承



2、抽象类与接口的区别?

接口就是比“抽象类”还“抽象”的“抽象类”

1.语法层面上的区别

1)抽象类使用abstract class声明,接口使用interface声明

2)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;

3)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;

4)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;

5)抽象类必须有构造方法,而接口没有构造方法

6)一个类只能继承extends一个抽象类,而一个类却可以实现implements多个接口。

2.设计层面上的区别

1)抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口
却是对类局部(行为)进行抽象。

2)抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。

接口的应用:JDBC

接口的应用:工厂模式

工厂模式:实现了创建者与调用者的分离
其实设计模式和面向对象设计原则都是为了使得开发项目更加容易扩展和维护,解决方式就是一个“分工”。
社会的发展也是这样,分工越来越细。
原始社会的人:人什么都要会,自己种,自己打猎,自己织衣服,自己治病
现在的人:可以只会一样,其他都不会,只会Java也能活,不会做饭,不会开车,不会....
面向对象的设计原则(总共六个):这里说几个和工厂模式相关的
 1.OCP(开闭原则,Open-Closed Principle):一个软件的实体应当对扩展开放,对修改关闭。
当我们写完的代码,不能因为需求变化就修改。我们可以通过新增代码的方式来解决变化的需求。如果每次需求变动都去修改原有的代码,
那原有的代码就存在被修改错误的风险,当然这其中存在有意和无意的修改,都会导致原有正常运行的功能失效的风险,这样很有可能会
展开可怕的蝴蝶效应,使维护工作剧增。
说到底,开闭原则除了表面上的可扩展性强以外,在企业中更看重的是维护成本。
所以,开闭原则是设计模式的第一大原则,它的潜台词是:控制需求变动风险,缩小维护成本。
 2.DIP(依赖倒转原则,Dependence Inversion Principle):要针对接口编程,不要针对实现编程。
如果A中关联B,那么尽量使得B实现某个接口,然后A与接口发生关系,不与B实现类发生关联关系。
依赖倒置的潜台词是:面向抽象编程,解耦调用和被调用者。
 3.LOD(迪米特法则,Law Of Demeter):只与你直接的朋友通信,而避免和陌生人通信。
要求尽量的封装,尽量的独立,尽量的使用低级别的访问修饰符。这是封装特性的典型体现。
一个类如果暴露太多私用的方法和字段,会让调用者很茫然。并且会给类造成不必要的判断代码。所以,我们使用尽量低的访问修饰符,
让外界不知道我们的内部。这也是面向对象的基本思路。这是迪米特原则的一个特性,无法了解类更多的私有信息。
另外,迪米特原则要求类之间的直接联系尽量的少,两个类的访问,通过第三个中介类来实现。
迪米特原则的潜台词是:不和陌生人说话,有事去中介。
工厂模式的分类:
 1.简单工厂模式:用来生产同一等级结构中的任意产品。(对于增加新的产品,需要修改已有代码)
 2.工厂方法模式:用来生产同一等级结构中的固定产品。(支持增加任意产品)
 3.抽象工厂模式:用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)
核心本质:
实例化对象,用工厂方法代替new操作。
将选择实现类、创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。

接口的应用:代理设计模式

代理模式(Proxy pattern):
核心作用:
通过代理,控制对对象的访问!
可以详细控制访问某个(某类)对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理。
(即:AOP的微观实现)。从而实现将统一流程代码放到代理类中处理。
AOP(Aspect Oriented Programming面向切面编程)的核心实现机制!
代理模式的核心角色:
1.抽象角色:主题
定义代理角色和真实角色的公共对外方法
2.真实角色
实现抽象角色,定义真实角色所需实现的业务逻辑,供代理角色调用。
关注真正的业务逻辑!
3.代理角色
实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
将统一的流程控制放到代理角色中处理!
应用场景:
  安全代理:屏蔽对真实角色的直接访问。
  远程代理:通过代理类处理远程方法调用(RMI)
  延迟加载:先加载轻量级的代理对象,真正需要再加载真实对象
  比如你要开发一个大文档查看软件,大文档中有大的图片,有可能一个图片有100MB,在打开文件时,不可能将 
  所有的图片都显示出来,
  这样就可以使用代理模式,当需要查看图片时,用proxy来进行大图片的打开。
分类
  静态代理(静态定义代理类)
  动态代理(动态生成代理类)
  JDK自带的动态代理,需要反射等知识
  CGLIB动态代理

猜你喜欢

转载自blog.csdn.net/weixin_43549578/article/details/83904077
今日推荐