Java中只支持单继承,一个子类只有一个直接的父类,当一个类型中需要兼容多种类型特征 ,或者多个不同类型具有相同特征时,我们就需要用到接口。
接口的创建
接口命名通常以大写I打头,后续单词第一位大写,如ICat,IDog。
public interface ICat {
}
接口的访问修饰符通常为public。
类之间只能单继承,但接口之间可以实现同时多个继承,父接口与父接口之间用逗号隔开,例如:
public interface ICat extends ICat1,ICat2 {
}
实现类承载接口
实现类承载接口的关键词为implements,并且可以同时承载多个接口。当一个类同时需要继承父类和承载接口时,父类在前,接口在后。如下代码:
public class Pet extends Animal implements ICat,IDog {
}
当多个接口中同时有一个同名方法时,即使是其中一个接口指向实现类去实例化,在调用方法时依旧会报错,这个时候就需要在是实现类中重写这个方法。
当继承的父类和承载的接口中有同名的方法时,子类调用的是父类的方法。但是当父类和接口中有重名的常量时,子类是无法正常运行的,需要子类重新定义
接口中属性的创建:
// public static final int month=2; //完整写法
int month=2; //简写
在接口当中定义常量时,修饰符public、static和final都是可以省略的。
接口中的属性创建时必须要初始化。
当借口和实现类中有重名的常量时,调用的是接口中的常量信息。
接口中方法的创建:
接口中的方法大致可以分为三类:抽象方法,默认方法和静态方法。
在接口中创建三种方法:
//抽象方法
// public abstract void sleep(); //完整写法
void sleep(); //简写
//默认方法
default void paw(){
System.out.println("四个爪子");
}
default void eat(){
System.out.println("猫吃鱼");
}
//静态方法
static void jump(){
System.out.println("猫跳得很高");
}
实现类中测试三种代码:
public class Pet implements ICat {
@Override
public void sleep () { //重写抽象方法(必须)
System.out.println("猫爱睡觉");
}
@Override
public void eat () { //重写默认方法(不必须)
ICat.super.paw(); //调用接口中的默认方法paw
ICat.super.eat(); //调用接口中的默认方法eat
ICat.jump(); //调用接口中的静态方法jump
}
public static void main(String[] args) {
Pet one =new Pet();
//抽象方法的调用
one.sleep();
//默认方法的调用
one.eat();
//静态方法的调用
ICat.jump();
}
}
抽象方法:
抽象方法没有方法体,并且其修饰符public和abstract都可以省略。当一个非抽象类实现接口时,需要实现接口中所有的抽象方法,而当抽象类实现接口时,可以不用实现所有的抽象方法,未实现的方法由继承这个抽象类的子类去实现。
默认方法:
默认方法既可以在实现类中重写,也可以不重写。
若想调用接口中的默认方法,则需要通过接口名.super.默认方法名的方式。例如,当接口中存在paw和eat两种默认方法,重写方法eat时,既可以调用接口中的默认方法eat,也可以调用paw,但是不能直接在主方法中调用,只能通过实例化对象去调用方法的方式使用。
静态方法:
静态方法带方法体,并且不能在实现类中重写。通过接口名.静态方法名的方式调用。既可以在方法中调用,也可以在主方法中直接调用,不能通过实例化对象去调用。
方法名 | 修饰符 | 有无方法体 | 是否需要重写 |
---|---|---|---|
抽象方法 | public abstract | 无 | 非抽象方法中必须重写 |
默认方法 | default | 有 | 可以重写,可以不重写 |
静态方法 | static | 有 | 不能重写 |