什么是接口
如果一个抽象类中的所有方法都是抽象方法,那么这个抽象类就是接口(interface)。
接口的特点
接口中的抽象方法必须通过一个类来实现,格式为 实现类 implement 接口
其中实现类为实现了接口中抽象方法的类。
例如以下代码
public interface Father {
void eat();
void speak();
void run();
}
public class Son implements Father{
@Override
public void eat() {
System.out.println("吃东西");
}
@Override
public void speak() {
System.out.println("说话");
}
public void run() {
System.out.println("奔跑");
}
}
因为Son类实现了Father类之中的抽象方法,所以Son类是Father类的实现类。
1、如果一个类没有实现接口中的所有抽象方法,则该类必须为抽象类,例如下图中的Son1类。
public abstract class Son1 implements Father{
@Override
public void speak() {
// TODO Auto-generated method stub
}
@Override
public void run() {
// TODO Auto-generated method stub
}
}
2、接口中没有默认构造方法,而且也不能定义构造方法
接口中的方法都是抽象方法或者为static和default修饰的默认方法(后两者是在jdk1.8版本新增,在以前的版本里接口之中只允许存在抽象方法。)
在JDK8及其以后版本的JDK中,接口内可以定义静态方法(static修饰的方法)与默认方法(default关键字修饰的方法)。
接口中的静态方法实现类无法继承,默认方法实现类可以继承。
Whale无法调用IMammal接口中eat静态方法,说明Whale无法继承接口中静态方法
Whale可以调用IMammal接口中eat默认方法,说明Whale可以继承接口中默认方法。
3、接口一般以I开头(例如ISon,IFather,这是一个约定成俗的习惯)
4、接口中的变量为public static fianl常量
例如,在上面的Father类之中我们定义age属性——
int age=36;
在子类之中我们对age属性进行修改——给age赋值为40,显示报错。
这是因为在接口之中的变量已经默认被 public static fina这三个修饰词共同修饰,无法改动。
5、接口中的抽象方法默认public abstract
所以说我们定义抽象方法直接就可以用【void +方法名();】来声明
需要注意的事项
1、一个类可以实现一个或n个接口;如果一个类没有实现接口中所有的抽象方法,则该类必须为抽象类
2、接口重复抽象方法,实现类实现一个;接口中重复常量名,实现类必须指定到底调用哪个接口中的常量
我们再定义一个Mother接口
public interface Mother {
void eat();
int WEIGHT=80;
}
再在Father接口之中定义相同的变量WEIGHT
int WEIGHT=100;
这时我们再发现子类之中只重写了一个eat()方法,但是没有报错,因为两个接口之中的eat方法是相同的。
如果名称相同而返回类型不同的话,比如一个是int eat(),一个是void eat()则会报错,而且java语法中不允许这种情况存在!
调用常量的话则必须指明是哪个类之中的常量比如Father.WEIGHT或者Mother.WEIGHT,单独的WEIGHT会报错。
3、public protected friendly private 只有public 和默认的能修饰类和接口
也就是说——接口和类前面的修饰词在这四个里面只能存在public和默认的,(friendly就是默认的,直接就是class 类名{},如果前面加friendly是错误的!)
疑难辨析
Java类只有单继承 对
但是Java中接口可以多继承 对
Java中只存在单继承 错 java类之中只存在单继承,java的接口之中可以多继承。
子接口可以实现父接口中的某些抽象方法 错 一旦实现接口的抽象方法,它要么是一个实现类要么是一个抽象类,接口不能实现抽象方法!
含有抽象方法的抽象类必须至少有一个子类完全实现了其抽象方法 对
如果一个子类没有完全实现父类之中的抽象方法,那么它就是一个抽象类,而抽象类无法创建对象,里面的方法也就彻底失去了意义,可以这样说,在完全实现父类抽象方法的子类出现之前,父类以及其之前的所有子类都是抽象类,都是处于无法调用的状态!
含有抽象方法的抽象类一定至少会有一个非抽象类 对
对,至少有一个非抽象类实现了抽象类的全部抽象方法。