接口
在我们日常生活中有许多的接口,例如USB接口,插座接口等,它们都是一种实现某种功能的标准。假如没有这些USB接口标准,那么我们可能每个U盘都有自己的接口形状,导致许多优盘不能插入电脑进行数据交互,假如没有插座接口,那么我们可能插座接口这个标准,那么就会有许多的电器不能插入插座,由此可见接口的重要性。
接口的概念
上面介绍了日常生活中的接口,了解了它们是一种实现某种功能的标准,在java中的接口也是一种标准,接口是对类的一组需求描述,是公共的行为规范标准,在实现时,只要符合规范标准,就可以通用。接口是一种引用数据类型。
接口的语法
接口的定义
我们知道接口是类的一组需求的描述。在定义时,我们要用到关键字interface。变量只能是public static final修饰的,方法没有具体的实现,并且都是由public abstract修饰的。这些用于修饰的关键字可以被省略,接口中的变量和方法会被隐式定义为这些修饰符修饰的。
public interface 接口名称{
//变量
public static final int a = 1;
public int b = 1;
static final int c = 1;
int d = 1;
//以上四种定义方式都是一样的效果,推荐第四种
// 抽象方法
public abstract void method1(); // public abstract 是固定搭配,可以不写
public void method2();
abstract void method3();
void method4();
// 注意:在接口中上述写法都是抽象方法,跟推荐方式4,代码更简洁
}
接口的实现
接口是为类服务的,它是类的一组需求的描述,类要想使用接口中的功能就得实现接口,实现接口要用到关键字implements,并且要对接口中的每个方法进行重写。
public class 类名称 implements 接口名称{
//..实例域
//...对所以接口中的方法进行重写(此部分不能省)
//..其他方法
}
接口的特性
- 接口是一种引用数据类型,但是不能直接用new关键字引用接口的对象。
- 接口中的方法必须是有public修饰的抽象方法,并且会被隐式定义为public abstract。
- 接口中的方法不能在接口中实现,只能由实现接口的类实现。
- 在类中重写接口中的方法一定要加public修饰,不能不加访问限定修饰符。
- 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量
- 接口中不能有静态代码块、实例代码块和构造方法。
- 如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类。
- 尽管每个类只能够拥有一个超类/父类, 但却可以实现多个接口。
interface A{
void func1();
}
interface B{
void func2();
}
interface C{
void func3();
}
class D{
public void func4();
}
//类E继承一个类,实现多个接口
class E extends D implements A,B,C{
//....
public void func1{
//...
}
public void func2{
//...
}
public void func3{
//...
}
}
- 接口之间也可以继承,并且可以是多继承
interface IRunning {
void run();
}
interface ISwimming {
void swim();
}
// 两栖的动物, 既能跑, 也能游
interface IAmphibious extends IRunning, ISwimming {
}
class Frog implements IAmphibious {
...
}
接口的使用及案例
实现Comparable接口从而实现对象数组的排序
我们知道在进行对基本数据类型的数组排序时可以使用Arrays.sort()函数进行,但是如果想对利用此方法对对象数组排序,前提必须是对象的类是实现了Comparable接口,这是由于Arrays.sort()函数的底层是要用到Comparable接口中的compareTo方法。重写compareTo方法应该遵循一下原则:
- 如果当前对象应排在参数对象之前, 返回小于 0 的数字;
- 如果当前对象应排在参数对象之后, 返回大于 0 的数字;
- 如果当前对象和参数对象不分先后, 返回 0;
class Student implements Comparable {
private String name;
private int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
} @
Override
public String toString() {
return "[" + this.name + ":" + this.score + "]";
} @
Override
public int compareTo(Object o) {
Student s = (Student)o;
if (this.score > s.score) {
return -1;
} else if (this.score < s.score) {
return 1;
} else {
return 0;
}
}
}
public class Demon1 {
public static void main(String[] args) {
Student[] students = new Student[] {
new Student("张三", 95),
new Student("李四", 96),
new Student("王五", 97),
new Student("赵六", 92),
};
Arrays.sort(students);
System.out.println(Arrays.toString(students));
}
}
执行结果:
[[王五:97], [李四:96], [张三:95], [赵六:92]]