接口的概念

Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。

接口的语法

  • 接口用关键字interface修饰:public interface 接口名{}
  • 接口是隐式抽象的,当声明一个接口时,不必使用abstract关键字
  • 类实现接口用implements表示:public class 类名 implements 接口名 {}
  • 接口中只包含两部分内容:常量和抽象方法(jdk7以前)
  • 接口中所有的元素都是public修饰的
  • 接口中的抽象方法定义时:public abstract修饰符可以省略
  • 接口中的常量定义时:public static final可以省略

接口的特点

  1. 就像一个类一样,一个接口也能够拥有方法和属性,但是在接口中声明的方法默认是抽象的(即只有方法标志符而没有方法体)
  2. jdk8之后除了定义常量和抽象方法之外,还可以定义静态方法,默认方法
  3. 接口中不能定义构造方法,构造方法用于创建对象,意味着接口不可以实例化
  4. 如果接口的实现类覆盖了接口中的所有抽象方法,则此实现类就可以实例化,如果实现类没有覆盖接口中的所有抽象方法,则此实现类仍为一个抽象类
  5. 一个接口可以被多个无关的类实现,一个类可以实现多个无关的接口,弥补了Java单继承的局限性
  6. 接口与接口之间可以继承(使用extends关键字),而且可以多继承

为什么要用接口

因为Java不像c++一样支持多继承,所以Java可以通过实现接口来弥补这个局限

接口也被用来实现解耦

接口的本质是契约,标准,规范,就像电源插孔,usb,制定好规范之后大家共同遵守共同使用

接口实现实例

//定义一个测试类
public class Test {
	public static void main(String[] args) {
		Teacher t=new Teacher();
		Speak s=new Student();//多态的形式
		t.speak();
		s.speak();
	}
}
//定义一个说话的接口
public interface Speak {
	void speak();
}

//定义一个老师类实现说话的接口
public class Teacher implements Speak {

	@Override
	public void speak() {
		System.out.println("老师说英语");
		
	}

}

//定义一个学生类实现说话的接口
public class Student implements Speak {

	@Override
	public void speak() {
		System.out.println("学生说中文");
		
	}

}

接口的继承

一个接口能继承另一个接口,和类之间的继承相似,使用extends关键字,比如父接口声明了两个方法,子接口声明了自己的一个方法,又继承了父接口,这样实现子接口的类就需要实现三个方法。

在接口的多继承中,只需使用一次extends关键字,在关键字后面跟着所有继承的接口,比如:

public interface zi extends fu1,fu2,fu3 {}

jdk8接口的新特性

jdk8之后除了定义常量和抽象方法之外,还可以定义静态方法,默认方法

静态方法:使用static关键字修饰,只能通过接口直接调用静态方法,并执行其方法体(即自己设置自己用)

默认方法:默认方法使用default关键字修饰,可以通过实现类对象来调用,如果实现类重写了接口中的默认方法,调用时任然调用的是重写后的方法,和继承中的重写一样。

如果子类继承的父类和实现的接口中声明了同名同参数的默认方法,那么子类在没有重写此方法的情况下,默认调用的是父类中的同名同参数的方法