接口中的方法实现
上一篇中简单介绍了接口的概念以及定义格式。Java学习之接口1(interface)
接下来,将介绍各种方法的实现过程。
根据上一篇的介绍:类与接口的关系为实现关系,即类实现接口,该类可以称为接口的实现类,也可以称为接口的子类。实现的动作类似于继承抽象父类的方法,格式相仿,只是关键字不同,实现使用 implements 关键字。
格式如下:
class 类名 implements 接口名 {
//方法体
}
抽象方法
public interface man { //接口定义
//定义接口的抽象方法
//public abstract void sleep();
public abstract void study();
}
public class oldman implements man { //接口的实现类的定义
@Override
public void study() { //接口中抽象方法的实现
System.out.println("活到老、学到老");
}
}
public class Main {
public static void main(String[] args) { //主函数创建对象并调用方法
oldman an=new oldman();
an.study();
总结:
非抽象子类实现接口:
- 必须重写接口中所有抽象方法。
- 继承了接口的默认方法,即可以直接调用,也可以重写。
- 如果实现类没有覆盖重写接口中所有的抽象方法,那么这个实现类本身必须是抽象类。
(解释:因为如果没有覆盖,则将父类的抽象方法继承下来,则这个子类就包含抽象方法,所以它必须是抽象类,同时,也必须有一个非抽象类来实现这个子类没有覆盖完的抽象方法)
默认方法
默认方法可以被继承,也可以被重写,但是在调用时,只能通过实现类的对象完成。(因为接口不能创建对象)
public interface man {
//定义接口的默认方法
public default void study(){
System.out.println("人要学习");
}
public default void sleep(){
System.out.println("老人要有充足的睡眠");
}
}
public class oldman implements man {
@Override
public void study() { //覆盖重写接口的默认方法
System.out.println("老人也要学习");
}
}
public class Main {
public static void main(String[] args) {
oldman an=new oldman();
an.study();
an.sleep();
}
}
主函数中创建的是子类的对象,从结果可以看出,study方法输出的是子类的成员方法(因为子类覆盖重写了接口的方法),而成功调用了sleep方法,代码中可以发现,子类并没有sleep方法,所以这是子类继承父类的成员方法。
静态方法
静态与.class 文件相关,只能使用接口名调用,不可以通过实现类的类名或者实现类的对象调用。
public interface man {
//定义接口的静态方法
public static void eat(){
System.out.println("人必须得吃饭");
}
}
public class oldman implements man {
///无法重写静态方法
}
public static void main(String[] args) {
//an.eat();
man.eat();
}
}
静态方法和对象无关,至于类有关。
私有方法
如果一个接口中有多个默认方法,并且方法中有重复的内容,那么可以抽取出来,封装到私有方法中,供默认方法去调用。但为了防止其他实现类误用,所以这个共有的方法应该是私有化的。从设计的角度讲,私有的方法是对默认方法和静态方法的辅助。
因此:
普通的私有方法:解决多个默认方法之间的重复代码问题。所以只能由默认方法调用。
静态私有方法:解决多个静态方法之间的重复代码问题。所以只能由静态方法调用。
public interface man {
///默认方法调用私有方法
default void eat(){
breakfast();
lunch();
}
//定义接口的私有方法
private void breakfast(){
System.out.println("早餐要吃好");
}
private void lunch(){
System.out.println("午餐要吃饱");
}
}
public class Main {
public static void main(String[] args) {
oldman an=new oldman();
an.eat();
}
}
另外还有一个内容即常量。接口中的常量和普通的常量用法类似,上一篇中介绍了其用法,可以自行阅读。Java学习之接口(interface)