接口
为什么需要接口?
抽象类中可以包含任意合法的方法;可以包含任意合法的成员变量;如果一个抽象类中只有抽象方法,则该抽象类可以定义位接口。
怎么做?
使用interface定义接口;实现类通过implements关键字实现该抽象类中的抽象方法
特点:
1、一个类没有实现完接口中所有方法,则该必须定义为抽象类
2、接口不能创建对象,且接口中没有构造方法
3、接口名常常I开头
4、接口中抽象方法默认为public abstract ,所以接口中定义抽象方法时可以省略public abstract;且只能是public
5、抽象类中可以定义任意合法的成员变量;但是接口中只能定义public static final 常量
6、JDK8以前版本的JDK中,定义的接口只能含有常量和抽象方法;JDK8 + 可以定义多个default或者static具体方法
7、java中类只能继承一个父类;但是java中接口可以继承多个接口,每个接口之间使用逗号间隔
8、函数式接口:
a、如果一个接口中只有一个抽象方法,则这个接口可以定义为函数式接口 @FunctionalInterface
b、JDK8.0
c、可以有多个默认方法和静态方法
9、instanceof:
instanceof运算符用于判断该运算符前面引用类型变量指向的对象是否是后面类或者其子类、接口实现类创建的对象,如果是则返回true,否则返回false
package 接口;
@FunctionalInterface//函数式接口
public interface IMammal{
int AGE = 90;
/*接口中没有构造方法
* public IMammal() {
*
* }
*/
//接口中的抽象方法默认public abstract,所以可以忽略
void move();
public default void eat() {
System.out.println("正在吃……");
}
public static void breath() {
System.out.println("正在睡觉……");
}
}
package 接口;
public interface IA {
void drink();
}
package 接口;
//实现接口的同时可以继承接口中的常量
public class Whale implements IMammal, IA {//可以继承多个接口
@Override
public void move() {
System.out.println("靠鳍移动……");
}
@Override
public void drink() {
System.out.println("正在喝水……");
}
}
package 接口;
public class Test {
public static void main(String[] args) {
// Mammal mammal = new Whale();//该行代码报错//抽象类不能创建对象
// mammal.move();
// Mammal m = new Mammal();//该行代码报错,接口不能创建对象
// System.out.println(IMammal.AGE);
// IMammal.AGE = 90;//常量不允许二次赋值,报错,证明AGE这里是一个常量
Whale whale = new Whale();
System.out.println(whale instanceof Whale);// 子类实现创建对象
System.out.println(whale instanceof Object);// 子类实现创建对象
System.out.println(whale instanceof IMammal);// 接口实现创建对象
}
}
//输出结果:
//true
//true
//true
接口与抽象类区别
1、定义:抽象类 abstract 接口interface
2、构造方法:抽象类有构造方法 接口没有构造方法
3、继承:抽象类只能单继承 接口可以继承多个接口
4、实现:抽象类型extends 接口implements
5、成员变量:抽象类可以定义任何合法的成员变量 接口只能定义public static final的变量即常量
6、方法:抽象类可以定义任意合法方法; 接口中只能定义抽象方法,JDK8.0+可以定义多个static或default修饰的具体方法
7、对象:抽象类和接口都不能创建对象