Java基础语法 接口(interface)的定义和实现
在学习接口之前,建议大家先熟悉一下前一篇文章对抽象的解释:Java基础语法 到底什么是抽象?,因为接口通俗的讲就是比抽象类更抽象的类,深入理解了抽象的概念之后,对学习接口会更有帮助。
1. 接口的定义
第一种解释:接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的类 。
接口只描述应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成。这样将功能的定义与实现分离,优化了程序设计。
第二种解释:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
第三种解释:有时必须从几个类中派生出一个子类,继承它们所有的属性和方法。但是,Java不支持多重继承。有了接口,就可以得到多重继承的效果。接口(interface)是抽象方法和常量值的定义的集合。
第四种解释:接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。
除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。
接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象上,这就是通过接口实现多态的关键。
//这里解释的有些生硬,我们通过下面这个案例来解释一下“接口类型可用来声明一个变量” //抽象类 Fu类 public interface Fu { void function(); } //子类实现父类 public class Zi implements Fu { //子类实现父类需要实现父类的抽象方法 @Override public void function() { System.out.println("重写父类方法"); } } //孙子类 public class Sun { //孙子类定义方法需要传入Fu对象 public void Fun(Fu fu){ System.out.println("测试"); } } //测试类 public class Test { public static void main(String[] args) { //多态的实现:父类的引用指向子类的对象 Fu fu = new Zi(); fu.function(); Sun sun = new Sun(); //传入的参数是父类的引用,实际传入的是子类的对象 sun.Fun(fu); System.out.println(fu); } }
打印结果:
重写父类方法 测试 com.test.Zi@15aeb7ab
2. 接口的声明与实现
//声明接口
[public/缺省] interface 接口名称 [extends 其他的接口名] {
// 声明变量(默认为常量)
// 抽象方法
}
//示例代码如下:
public interface Fu {
int a = 0;//定义的变量默认被static和final修饰,必须赋初值。
void function();
}
//实现接口
...implements 接口名称[, 其他接口名称, 其他接口名称..., ...] ...
//示例代码如下:
public class Zi implements Fu {
@Override
public void function() {
System.out.println("重写父类方法");
}
}
3. 接口的特点
接口可以理解成统一的协议, 而接口中的属性也属于协议中的内容。但是接口的属性都是公共的,静态的,最终的。接口的成员特点:
1、成员变量只能是常量,默认修饰符 public static final,使用变量的时候,变量必须被赋值。
2、成员方法只能是抽象方法。默认修饰符 public abstract
接口不可以创建对象。
多个无关的类可以实现同一个接口。
一个类可以实现多个无关的接口(多实现),例如:public class Hockey implements Sports, Event。
接口之间可以多继承,例如:public interface Hockey extends Sports, Event。
与继承关系类似,接口与实现类之间存在多态性。
接口也可以继承另一个接口,使用extends关键字。
接口没有构造方法,不能被实例化。
子类必须覆盖掉接口中所有的抽象方法后,子类才可以实例化。否则子类是一个抽象类。
/*
* 接口的成员特点:
* 只能有抽象方法
* 只能有常量
* 默认使用public&abstract修饰方法
* 只能使用public&abstract修饰方法
* 默认使用public static final来修饰成员变量
*
* 建议:建议大家手动的给上默认修饰符
*
* 注意:
* 接口不能创建对象(不能实例化)
* 类与接口的关系是实现关系,一个类实现一个接口必须实现它所有的方法,否则子类也无法实例化。
*/
//测试类
public class InterfaceDemo {
public static void main(String[] args) {
//Animal a = new Animal();//创建对象报错
//Animal.num;//调用常量
//Cat cat = new Cat();//创建子类对象
}
}
//接口类
interface Animal {
//定义变量
public static final int num = 10;
//定义抽象方法
public abstract void eat();
}
//子类实现接口类
class Cat implements Animal {
//重写父类方法
public void eat() {
}
}
注意(无关紧要,知道就行):
①在 JDK8,允许我们给接口添加两种非抽象的方法实现:
1、默认方法,添加 default 修饰即可;
2、静态方法,使用 static 修饰即可;
示例如下:
interface Test{ //这个是默认方法 default String get(String aa){ System.out.println("我是jdk1.8默认实现方法..."); return aa; } //这个是静态方法 static void staticmethod(){ System.out.println("我是静态方法"); } }
调用得话,静态方法只能通过接口名调用,不可以通过实现类的类名或者实现类的对象调用,default 方法只 能通过接口实现类的对象来调用。
②在 JDK9之后,允许我们给接口添加私有方法。
4. 接口与类的关系
- 类与类之间: 继承关系,一个类只能直接继承一个父类,但是支持多重继承
- 类与接口之间: 只有实现关系,一个类可以实现多个接口
- 接口与接口之间: 只有继承关系,一个接口可以继承多个接口
5. 接口和抽象类的区别
共性:不断的进行抽取,抽取出抽象的没有具体实现的方法,都不能实例化(不能创建对象)
区别
与类的关系
类与接口是实现关系,而且是多实现,一个类可以实现多个接口;
类与抽象类是继承关系,Java中的继承是单一继承,多层继承,一个类只能继承一个父类,但是可以有爷爷类。
成员的区别
a.成员变量
抽象类可以有成员变量,也可以有常量 接口只能有常量,默认修饰符public static final
b.成员方法
抽象类可以有抽象方法,也可以有非抽象方法 接口只能有抽象方法,默认修饰符 public abstract
c.构造方法
抽象类有构造方法,为子类提供 接口没有构造方法