Java 面向对象编程--接口

序言

在 Java 中不允许多重继承,如果要实现多继承的需求,则可以使用接口。使用接口的好处包括:

  1. 实现多态:接口可以被多个类实现,从而可以实现多态性,提高代码的灵活性和可扩展性。
  2. 实现解耦:接口定义了方法的规范,使得各个模块之间相互独立,减少模块之间的依赖性,提高系统的灵活性和可维护性。
  3. 提高代码的复用性:通过接口可以定义通用的方法和属性,不用重复编写代码,提高代码的复用性和可读性。
  4. 规范代码结构:接口可以定义规范,使得项目开发过程更加规范和有序,减少bug产生的可能性。
  5. 实现了多继承:Java中类只能单继承,但是可以实现多个接口,通过接口可以实现多继承的效果。
     

初识接口

生活中的接口就是一套规范,满足这个规范的设备就可以组装到一起。大家熟悉的计算机,主板上的周边元件扩展接口,插槽就可以被理解为接口,它有统一的标准,规定了尺寸、排线等。主板厂商和各种卡的厂家都遵守了这个统一的接口规范,因此,声卡显卡、网卡尽管内部结构和功能都不一样,但是都可以插在 PCI插槽上正常工作。

在 Java 中接口的作用和生活中的接口类似,它是一种规范和标准,可以约束类的行为,使实现接口的类(或结构)在形式上保持一致。

接口是一些方法特征的集合,从这个角度来讲,接口可以被看作一种特殊的“抽象类”,但是采用与抽象类完全不同的语法来表示,两者的设计理念也不同。抽象类利于代码复用,接口利于代码的扩展。
 

定义和实现接口

JDK1.8版本与之前的版本相比,接口的功能更加强大灵活。下面将以JDK1.8版本为基础讲解如何定义一个接口。
简单地说,接口是一个不能实例化的类型。接口类型的定义语法格式如下:

[访问修饰符] interface 接口名{
	//接口成员
}

类实现接口的语法格式:

class 类名 implements 接口名{
	//类成员
}

注意:

  1. 接口的定义使用 interface 关键字,接口的命名一般以I字母开头,除此之外,命名规则与类相同。如果访问修饰符是 public,则该接口在整个项目中可见;如果省略访问修饰符,则该接口只在该包中可见。
  2. 接口中的属性都会自动使用 public static final修饰,无论是否写此关键字,接口的属性都是全局静态常量,必须在定义时指定初始值。例如,在接口中定义以下成员,其中代码行①和代码行②两条语句是等效的。
int p = 5;                        //1
public static final int p = 5;    //2
int p;                            //错误,接口中必须指定初始值
  1. 在JDK1.8版本之前,在接口中只能定义抽象方法。从JDK1.8版本开始,接口还允许定义静态方法和默认方法。

代码示例:

public interface MyInterface(
	int p=5;
	//抽象方法
	void function1();
	//默认方法
	default void function2(){
		System.out.println("这是一个默认方法");
	}
	//静态方法
	static void function3(){
	System.out.println("这是一个静态方法");
	}
}

其中,function1() 为抽象方法,类似于类的抽象方法,只有方法声明,以”;”结尾。这里,系统会自动添加 public abstract 修饰。接口的实现类必须实现接口中定义的所有的抽象方法。接口中 function2() 为默认方法,使用 default 来修饰。接口中的默认方法如果不能满足某个实现类的需求,可以在实现类中重写这个默认方法。接口中 function3() 为静态方法,使用static 来修饰。它类似于默认方法,但不同的是静态方法不允许在实现接口的类中进行重写。另外,接口中定义的静态方法,只能通过接口名称调用不能通过实现类的类名或实现类的对象调用。
 

定义复杂的接口

语法:

[ 访问修饰符 ] interface 接口名 extends 父接口 1,父接口 2,{
	//常量定义
	//方法定义
}

接口之间可以通过 extends 关键字实现继承关系,一个接口可以继承多个接口,但接口不能继承类。
一个普通类只能继承一个父类,但能同时实现多个接口,也可以同时继承一个父类并实现多个接口。

具体语法如下:

class 类名 extends 父类名 implements 接口 1,接口 2,{
	//类的成员
}

这里,类继承一个父类,但通过 implements 关键字实现多个接口,此时 extends 关键字必须位于implements 关键字之前。另外,这个类必须实现所有接口(接口1,接口 2,.…)的全部抽象方法;否则必须定义为抽象类。
 

接口的应用

通过将接口作为类的属性,就可以灵活地接收所有实现这个接口的类的对象,即使需求变化,只要符合接口规范,就也能直接装配,不需要改动已有的代码,这使程序具有更好的可扩展性和可维护性。

另外,接口也是对 Java 类的单继承性的一种补充。在Java 中,类只能继承一个父类,这种单继承性使代码更加纯净,但是也使类的扩展变得困难。接口弥补了单继承的缺陷,使类可以灵活地扩展。接口类似于一个组件,需要时可以自由组装,因此更利于代码的扩展和维护。

事实上,在 JavaAPI中也定义了很多接口。例如,实现对象比较的 Comparable 接口,实现类序列化的 Serializable 接口等。Java API定义接口,开发人员必须按照接口定义的规则(也就是定义的方法名、参数及返回值)来实现相应的功能。
 

面向对象设计原则

  1. 摘取代码中变化的部分,形成接口
  2. 多用组合,少用继承
  3. 面向接口编程,不依赖于具体实现
    接口体现了约定和实现相分离的原则,通过面向接口编程,可以降低代码间的耦合性,提高代码的可扩展性和可维护性。

面向接口编程就意味着:当开发系统时,主体构架使用接口。如果对一个类型有依赖,应该尽量依赖接口,尽量少依赖子类。因为子类一旦变化,代码变动的可能性就很大,而接口要稳定得多。在具体的代码实现中,体现在方法参数、方法的返回值、属性类型尽量使用接口等。
 

总结

  1. 接口中的属性都是全局静态常量。自 JDK1.8 起,在接口中可以定义的方法包括抽象方法、静态方法和默认方法。
  2. 类只能继承一个父类,但是可以实现多个接口。Java通过实现接口可以达到多重继承的效果。
  3. 接口表示一种约定,也表示一种能力。接口体现了约定和实现相分离的原则。通过面向接口编程,可以降低代码间的耦合性,提高代码的可扩展性和可维护性。
  • 27
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值