1.先由抽象类引出接口的概念
- 一个抽象类中都是抽象方法,则可以将该抽象类定义成接口
- 接口中的抽象方法必须通过一个类来实现 implements 接口 实现类:一个实现了接口中抽象方法的类,因为Whale类实现了接口中抽象方法,所以Whale类即是实现类
- 接口中需要注意以下几点
详细代码见抽象类里
-
//1、如果一个类没有实现接口中的所有抽象方法,则该类必须为抽象类
//2、接口中没有默认构造方法,而且也不能定义构造方法
//3、接口一般以I开头
//4、接口中的变量为public static fianl常量
//5、接口中的抽象方法默认public abstract
2.什么是接口
Java接口是抽象方法的集合,其定义语法为:
访问权限控制符 interface 接口名 [extends 接口列表] {
常量;
抽象方法;
内部类; }
package com.edu.zzu.test;
public interface IFather{
int age=40;
void eat();
}
接口内只能包含常量(public static final)、抽象方法及内部类。 接口中的抽象方法必须为public访问权限控制符,不能为其它控制符。
3.接口与继承
- Java类只有单继承,但是Java中接口可以有多继承,类通过implements关键字时间接口继承
- 在JDK8及其以后版本的JDK中,接口内可以定义静态方法(static修饰的方法)与默认方法(default关键字修饰的方法),在这里需要注意的是,接口中不能有普通方法。接口中的静态方法实现类无法继承,默认方法实现类可以继承。
- 一个类可以实现一个或多个接口,如果一个类实现了一个接口,但没有实现接口中的所有抽象方法,那么这个类必须是abstract类。在这里需要注意的一点有,接口不能继承接口。
- 如果多个接口中定义了相同的抽象方法,则在实现类中只实现其中一个即可;
public interface ICircle {
double getArea();
}
public interface IRectangle {
double getArea();
}
public class GraphicalUtil implements ICircle, IRectangle {
@Override
public double getArea() {
return 0;
}
}
- 如果一个类中实现了多个接口,且接口中重复常量名,在实现类中必须指定到底使用哪一个。
- 只有public和默认的两种访问修饰符能修饰类和接口,在接口和类中,默认的直接不写
4.接口中需要注意的其他问题
- 通过extends关键字可以使自定义的接口实现继承,但需要注意以下两点: 接口只能继承父接口,不能继承抽象类和普通类。 接口弥补了Java单一继承的缺点(Java中的类只能继承一个父类),即接口可以继承多个父接口,它们之间用英文逗号隔开。
- 接口回调描述的是一种现象:接口声明的变量指向其实现类实例化的对象,那么该接口变量就可以调用接口中的抽象方法。
上述实例就说明了接口没有构造方法,不能创建自己的对象,但是可以引用实现类的对象。
- 抽象类与接口区别
5.函数式接口
- 接口中有一个抽象方法,则该接口可以由@Functionalinterface修饰,称为函数式接口
- 函数式接口主要用于Lambda,用于简化匿名内部类
- 从JDK8开始,在函数式接口中可以包含一个或多个由default,static修饰的非抽象方法
package com.jd.service;
@FunctionalInterface
public interface IMammal {
void move();
public default void speak() {
System.out.println("speaking......");
}
public static void speak1() {
System.out.println("speaking......");
}
}