Java接口
1.接口介绍
接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合。接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
接口有助于我们统一规范。在接口中指定统一的方法名和属性名,让类实现方法,能规范化代码,减少不统一的方法头带来的损耗。
public interface UsbInterface {//接口,用于指定规范
//规定接口的相关方法
public void start();
public void stop();
}
2.接口特性
- 接口中所有的方法都会被隐式指定为public abstract,所有的变量都会被隐式指定为public static final变量。
interface Interface_{
int n1 = 10;//完整语句为public static final int n1 = 10;
public void hi();//完整语句为public abstract void hi();
}
- 接口中定义的方法是不能再接口中实现的,只能由实现接口的类来实现接口中的方法。(注意:此处的方法不包含下面的默认实现方法和静态方法)
- jdk8后,接口中可以有默认实现方法和静态方法。
interface Interface_{
//在jdk8 后, 可以有默认实现方法,需要使用default关键字修饰
default public void ok(){
System.out.println("ok.........");
}
//在jdk8后,可以有静态方法
public static void cry(){
System.out.println("cry..........");
}
}
默认实现方法和静态方法的调用:
class A implements AInterface{
@Override
public void hi() {
//子类中可以直接调用父类接口默认方法
AInterface.super.ok();
//调用父类静态默认方法
AInterface.cry();
}
}
3.接口与类的相似点与区别
(1)相似点
- 接口和类都能有多个方法
- 接口和类一样,都存在多态传递现象
(2)区别
- 接口不能实例化对象,类可以
- 接口没有构造器,类必须要有构造器
- 接口中所有的方法必须是抽象方法(除了默认实现方法和静态方法)
- 接口不能包含成员变量(除了static 和 final 变量)
- 接口不是被类继承,而是要被类实现
- 接口支持多继承,类只能够单继承,但类可以实现多个接口
(3)接口与抽象类的区别
-
抽象类中的方法可以有方法体,接口中的方法不行
abstract class abstract_{ public void say(){}//{}为方法体 } interface Mytools{ public void say();//接口方法不能有方法体 }
-
抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
-
抽象类可以有静态代码块和静态方法,接口不能有静态代码块,但静态方法在jdk8以后可以有。
-
实际应用时,什么情况选择使用接口?
抽象类是对事物的抽象,它包含属性和行为(方法)的抽象,而接口是对行为的一种抽象。比如飞机和鸟没有共同的属性,但是他们有共同的行为——都能够飞。而飞机本身有很多种,像战斗机、客机等,这时候我们可以将他们的共有属性——比如说引擎,作为抽象类。
总的来说,什么情况应该使用接口——
- 需要实现多态
- 要实现的方法(功能)不是当前类族的必要(属性)
- 要为不同类族的多个类实现同样的方法(功能)
4.接口简单实例
interface UsbInterface {//接口,用于指定规范
//规定接口的相关方法
public void start();
public void stop();
}
// Phone 类实现 UsbInterface 接口规定/声明的方法
class Phone implements UsbInterface{
@Override
public void start() {
System.out.println("手机开始工作");
}
@Override
public void stop() {
System.out.println("手机停止工作");
}
}
class Computer {
//传入参数为实现接口的类
public void work(UsbInterface usbInterface){
//通过接口,来调用方法
usbInterface.start();
usbInterface.stop();
}
}
public class Interface01 {
public static void main(String[] args) {
Phone phone = new Phone();
//创建计算机
Computer computer = new Computer();
computer.work(phone);//输出: 手机开始工作 手机停止工作
}
}
5.接口的继承
在Java中,类的多继承是不合法,但接口允许多继承。
public interface AInterface {
public void hi();
}
interface UsbInterface {
public void start();
public void stop();
}
interface Mytools extends UsbInterface, AInterface{
public void say();
}
class exercise_ implements Mytools{
//该类需要实现三个接口的所有方法
@Override
public void hi() {
}
@Override
public void say() {
}
@Override
public void start() {
}
@Override
public void stop() {
}
}
6.接口引用指向实现该接口的对象
我们清楚接口是不可以被实例化, 但是接口引用可以指向1个实现该接口的对象.
public class exercise_ {
public static void main(String[] args) {
A a = new B();//类比向上转型
B b = (B)a;//类比向下转型
}
}
interface A{}
class B implements A{}