在Java中接口不是类,而是对类的一组需求描述,可以理解成建立在类和类之间的桥梁规范。
例:我要实现对Employee类的员工对象进行排序,我们可以使用Arrays类sort方法,但是Arrays类的sort方法不知道需要按什么排序,所以需要规范一个函数名,并提供区分对象间的方法。
要实现Arrays类的类方法sort对Employee类对象的工资高低进行排序,就需要实现Comparable接口
public interface Comparable<Employee>
{
int compareTo(Employee e)
}
为了让类实现一个接口,通常需要下面两个步骤:
1.将类声明为实现给定的接口(使用关键字implements)
2.对接口的所有方法进行定义(接口中的方法自动属于public 不需要自行添加public)
Comparable只有一个方法,而大多接口是多个方法,接口还可以定义常量,在javase8之前不能在接口中实现方法,java8之后可以实现简单的方法。
下面是Employee实现Comparable接口的代码:
public class Employee implements Comparable<Employee>
{
private String name;
private double Salary;
public int compareTo(Employee e)
{
return Double.compare(this.Salary,e.Salary);
}
...
}
二,接口特性
1.接口不是类,不能实例化对象不能用关键字new 来构造一个接口对象
Comparable a=new Comparable();//报错
2.但是可以声明一个接口变量
Comparable a;//ok
3.声明接口变量必须指向实现接口的类对象
Comparable a=new Employee();//ok
4.接口可以像类一样的被其他接口继承
public interface M
{
.....
}
public interface N extends M
{
...
}
5.接口中不能有实例域和或静态方法,但却可以包含常量。跟接口中方法一样,接口中的域自动设置为public static final
public interface M
{
int faction();
int fv=333;
}
注意:可以将接口中的方法和域加上public和public static final 不会报错但不建议这么做 没有必要多此一举
instanceof关键字:
1.看对象能否成功转换成特定的类的对象
if(e instanceof Manager)
{
Manager m=(Manager)e;
}
可以避免一些类型转换异常,一般用于超类转向子类对象
2.可以用instanceof检查一个对象的类是否实现了相应的接口
if(e instance Comparable)
{
.....
}
有的接口定义了常量没有定义方法,比如SwingConstants就是这样的一个接口,实现这个接口的类,将继承这个接口中的常量,并可以直接访问接口中的常量而不需要想“SwingConstants.某个常量”。
java中一个类只能继承一个超类,但可以实现多个接口,接口名字用都好隔开即可。这就是接口跟抽象类的最大区别,由于java是单继承不想C++多继承,所以java需要多继承的地方用接口来替代,从而是的代码更简洁明朗。
javase8之后,允许在接口中增加静态方法。目前为止,通常的做法是将静态方法放在伴随类中如:Path跟Paths