目录

1、接口的概念

2、定义接口

3、实现接口

4,对接口的引用


1、接口的概念

java中的接口(interface)在语法上有些相似于abstract类,他定义了若干个抽象方法和常量,这些方法通常对应与某一组功能,表示事物具有某方面的特性。

作用

  1. 通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系。
  2. 通过接口可以指明多个类需要实现的公共方法。
  3. 通过接口可以了解对象的交互界面,而不需要了解对象所对象的类

帮助实现类似于多重继承的功能。

java制作接口 java接口编写教程_开发语言

 注:图片选自java程序设计第三版,唐大什

多重继承:指一个子类可以有一个以上的直接父类,该子类可以继承它所有直接父类的成员。JAVA不支持多重继承,而是用接口实现比多重继承更强的功能。

2、定义接口

java中声明接口的语法

[public] interface 接口名 [extends 父接口名列表]{
    //接口体
    //常量声明
    [public] [static] [final] 类型 变量名=常量名;
     //抽象方法声明
     [public] [abstract] 返回值 方法名(参数列表) [throws异常列表];
}

通常接口名依able或ible结尾。

 接口中包括字段及方法,与类中的字段与方法有不同之处:

  • 接口中的字段实际上是常量,字段前即使省略修饰符,任然默认为public、static、final。
  • 接口中的方法都是抽象方法,不能有实现体;方法前面即使省略修饰符,仍然默认为public、abstract。

事实上,定义接口时,一般都省略字段和方法的修饰符。

接口也具有继承性。定义一个接口时可通过extends关键字声明该新接口是某个已经存在的父接口的派生借口,它将继承父类接口的所有字段和方法。与类的继承不同的是,一个接口可以有一个以上的父接口,他们之间用逗号分隔,形成父接口列表。新接口将继承所有父接口中的属性和方法。

interface Collection{
	int MAX_NUM=100;
	void setadd();
	/*
	 该例定义了一个名为collection的接口
	 声明了一个常量和一个方法。
	*/
}

3、实现接口
 

一个类要实现接口时,请注意以下问题。(可以看一下)

  • 在类的声明部分,用implements关键字声明该类将要实现哪些接口。
  • 如果实现某接口的类不是abstract的抽象类,则在类的定义部分必须实现指定接口的所有抽象方法。如果其直接或间接父类中实现了接口,父类所实现的接口中的所有抽豪方法都必须有实在的方法体。也就是说,非抽象类中不能存在抽象方法。
  • 一个类在实现某接口的抽象方法时,必须使用完全相同的方法头。否则,只是在重载一个新的方法,而不是实现已有的抽象方法。
  • 接口的抽象方法的访问限制符都已指定为public,所以类在实现方法时,必须显式地使用public修饰符,否则将被系统警告为缩小了接口中定义的方法的访问控制范围。
  • 最好在实现接口的方法前面使用@Override以让编译器更好地检查该方法。
  • 一个类只能有一个父类,但是它可以同时实现若干个接口。一个类实现多个接口时,在implements子句中用逗号分隔。这种情况下如果把接口理解成特殊的类,那么这个类利用接口实际上就获得了多个父类,即实现了多重继承。

例如

interface Runner{
	void run();
}
interface Swimmer{
	void swim();
}
interface Flyable{
	void gly();
	void land();
	void takeoff();
}
/*上面定义了三个接口,分别名为Runner,Swimmer,Flyable*/
abstract class Animal{
	int age;
	abstract public void eat();
}
/*定义了一个抽象类*/
class Flyman extends Animal implements Runner,Flyable,Swimmer
{

	@Override
	public void run()
	{
		System.out.println("run");
	}

	@Override
	public void swim()
	{
		System.out.println("swim");
	}

	@Override
	public void gly()
	{
		System.out.println("gly");
	}

	@Override
	public void land()
	{
		System.out.println("land");
	}

	@Override
	public void takeoff()
	{
		System.out.println("takeoff");
	}

	@Override
	public void eat()
	{
		System.out.println("eat");
	}
	
	
}
public class Main
{
	public static void main(String[] args)
	{
	   Main p=new Main();
       Flyman t=new Flyman();
	   p.m1(t);
	   p.m2(t);
	   p.m3(t);
	}

	private void m3(Animal t)
	{
		t.eat();
	}

	private void m2(Swimmer t)
	{
		t.swim();
	}

	private void m1(Runner t)
	{
		t.run();
	}
	
}

程序中定义了三个接口和一个抽象类,并让一个类来继承这个抽象类并实现这三个接口。

4,对接口的引用

接口可以作为一种引用类型来使用。接口类型的变量可以引用到任何实现该接口的类的实例,通过该变量可以访问类所实现的接口中的方法。Java运行时系统动态地确定该使用哪个类中的方法。

把接口作为一种数据类型可以不需要了解对象所对应的具体的类,而着重于它的交互界面,仍以前面所定义的接口Collection和实现该接口的类Queue为例,下例中,以Collection作为引用类型来使用

class InterfaceType{
	public static void main(String args[]){
		Coolection c=new Queue();
		c.add(obj);
	}
}