Java面向对象之接口

内容:

1、接口的概念与定义

2、类实现接口

3、接口的特点

4、接口和抽象类的区别

1、接口的概念与定义

(1)类和接口

类:具有相同属性和功能的事物集合

接口:接口是功能的集合,也就是方法的集合,也就是说接口中只能定义方法,不能定义普通的成员变量

而且接口中的成员方法必须都是抽象的,可以理解接口是比抽象类更加抽象的一种类

(2)接口的定义

定义类的关键字:class

定义抽象类的关键字:abstract

定义接口的关键字:interface

定义接口所在的仍为.java文件,虽然声明时使用的为interface关键字的编译后仍然会产生.class文件,

这点可以让我们将接口看做是一种只包含了功能声明的特殊类

格式如下:

1 public interface 接口名{
2       // 成员变量: 不能定义普通的成员变量
3       // 成员方法: 必须都是抽象
4       public abstract 返回值类型 方法名();
5 }

使用interface代替了原来的class,其他步骤与定义类相同:

  • 接口中的方法均为公共访问的抽象方法
  • 接口中无法定义普通的成员变量

(3)各种类型之间的关系

  • 类和类之间:继承,只能是单继承,一个子类只能有一个父类
  • 接口和接口之间:继承,可以多继承,一个子接口可以有多个直接父接口
  • 类和接口之间:不叫继承,叫实现(implements),可以多实现,一个类可以实现多个接口

2、类实现接口

类与接口的关系为实现关系,即类实现接口。实现的动作类似继承,只是关键字不同,实现使用implements

其他类(实现类)实现接口后,就相当于声明:”我应该具备这个接口中的功能”。实现类仍然需要重写方法以实现具体的功能

格式:

1 class 实现类 implements 接口 {
2     // 重写接口中所有方法
3 } 

在类实现接口后,该类就会将接口中的抽象方法继承过来,此时该类需要重写该抽象方法,完成具体的逻辑

  • 接口中定义功能,当需要具有该功能时,可以让类实现该接口,只声明了应该具备该方法,是功能的声明
  • 在具体实现类中重写方法,实现功能,是方法的具体实现

于是,通过以上两个动作将功能的声明与实现分开,此时请思考:类是现实事物的描述,接口是功能的集合

3、接口的特点

接口中成员的特点如下:

  • 接口中可以定义成员变量,但是变量必须用public static final修饰(固定修饰符),这样的变量其实是常量,其值不能改变
  • 接口中可以定义方法,方法也有固定的修饰符,public abstract
  • 接口不可以创建对象(抽象类也不可以创建对象)
  • 实现类必须覆盖掉接口中所有的抽象方法后,实现类才可以实例化。否则实现类是一个抽象类

示例代码:

1 // 接口
2 public interface MyInter {
3     // 接口的成员变量(常量)
4     public static final int a = 3;
5     // 接口的方法
6     public abstract void show();
7 }

注:固定修饰符可以不写也可以按心情想写哪个写哪个,但是不写不代表没有,不写时编译器会自动添加

在开发中最常用的模式:

1 // 一个类继承一个抽象类 同时实现多个接口
2 public class A extends AbstractClassB implements 接口A, 接口B{
3 
4 }

注:A中必须重写抽象类中的抽象方法以及所有接口中的抽象方法!

接口的特点:

  • 接口可以继承接口  A接口继承B接口后,A接口便拥有了A、B两个接口中所有的抽象方法
  • Java支持一个类同时实现多个接口,或一个接口同时继承多个接口
  • 类可以在继承一个类的同时,实现多个接口
  • 接口与父类的功能可以重复,均代表要具备某种功能,并不冲突

4、接口和抽象类的区别

相同点:

  • 都位于继承的顶端,用于被其他类实现或继承
  • 都不能直接实例化对象
  • 都可以包含抽象方法,其子类都必须覆盖重写或实现这些抽象方法

区别:

  • 抽象类为部分方法提供实现,避免子类重复实现这些方法,提高代码重用性;
  • 接口只能包含抽象方法,而抽象类可以包含抽象方法也可以包含普通方法;
  • 一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口;(接口弥补了Java的单继承)
  • 抽象类为继承体系中的共性内容,接口为继承体系外的扩展功能

二者的选用:

  • 优先选用接口,尽量少用抽象类
  • 需要定义子类的行为,又要为子类提供共性功能时才选用抽象类
原文地址:https://www.cnblogs.com/wyb666/p/10299971.html