public interface IMammal {//注意没有class
public abstract void move() ;
public abstract void eat() ;
}
1、定义:如果一个抽象类中都是抽象方法,则可以将该抽象类定义成接口 interface
注:接口一般以I开头,这样做使代码更加规范,增加了代码的可读性
2、接口中的抽象方法必须通过一个类来实现 implements 实现
接口实现类:一个实现了接口中抽象方法的类,因为Whale类实现了接口中抽象方法,所以Whale类即是实现类
public class Whale implements IMammal {
@Override
public void eat() {
// TODO Auto-generated method stub
}
@Override
public void move() {
System.out.println("靠鳍游动......");
}
}
接口注意事项
1、前面已提及接口一般以I开头
2、public protected friendly private中 只有public 和默认的能修饰类和接口
3、类似抽象类,如果一个类没有实现接口中的所有抽象方法,则该类必须为抽象类
4、接口回调描述的是一种现象:接口声明的变量指向其实现类实例化的对象,那么该接口变量就可以调用接口中的抽象方法
接口没有构造方法,不能创建自己的对象,但是可以引用实现类的对象
接口中没有默认构造方法,而且也不能定义构造方法
5、接口中的变量为public static final常量,所以可以用类名调用,但不可二次定义赋值
(黄框左上角S F指的是static final)
6、接口中的抽象方法默认public abstract
所以接口里的方法可以不用写public abstract,如
public interface IMammal {
void move() ;
void eat() ;
int age = 12;
}
7、Java8以前版本中规定,接口中所定义的方法只能是抽象方法,从在JDK8及其以后版本的JDK中开始,接口中可以添加一个或多个由default关键字修饰的非抽象方法——默认方法,该方法又称为扩展方法,该默认方法将由接口实现类创建的对象来调用,如下例:
public interface IMammal {
void move();
public default void eat() {
System.out.println("哺乳动物正在吃......");
}
}
同样,从JDK8开始,接口中可以添加一个或多个由static关键字修饰的非抽象方法——静态方法,该方法将由接口直接调用,如下例
interface IMammal {
void move();
static void eat() {
System.out.println("哺乳动物正在吃......");
}
}
注意:接口中的静态方法实现类无法继承, 默认方法实现类可以继承,如下例
8、通过extends关键字可以使自定义的接口实现继承,但需要注意以下两点:
接口只能继承父接口,不能继承抽象类和普通类。
接口弥补了Java单一继承的缺点(Java中的类只能继承一个父类),即接口可以继承多个父接口,它们之间用英文逗号隔开。
public interface SonSon extends IMother,IFather
9、接口实现
通过implements关键字实现接口,Java中的类只能是单继承,但类却可以实现多个接口以弥补Java类单继承的不足,其语法如 下:
访问控制符 修饰符 class 类名 implements 接口1 [,接口2, ……] { 变量; 方法; }
10、 子接口可以实现父接口中的某些抽象方法错
11、含有抽象方法的抽象类必须至少有一个子类完全实现了其抽象方法 √(如下图的son类)
含有抽象方法的抽象类一定至少会有一个非抽象类,
12、(1)接口重复抽象方法,实现类实现一个;
(2)接口中重复常量名,实现类必须指定到底调用哪个接口中的常量
13、一个类可以实现一个或n个接口;如果一个类没有实现接口中所有的抽象方法,则该类必须为抽象类
14、函数式接口
如果接口内只定义一个抽象方法,则该接口称为函数式接口,如下例:
@FunctionalInterface
interface IMammal {
String NAME = "哺乳动物";
void move();
public default void eat() {
System.out.println("哺乳动物正在吃......");
}
注意:
可以使用@FunctionalInterface 注解来验证一个接口是不是函数式接口,Java8中java.lang.Runnable、java.util.Comparator<T>都是函数式接口;
函数式接口中可以定义多个常量、多个默认方法和多个静态方法,但只能定义一个抽象方法及多个java.lang.Object中的public方法,如下例:
@FunctionalInterface
interface IMammal {
void move();
public default void eat() {
System.out.println("哺乳动物正在吃......");
boolean equals(Object obj);
}
其实equals是Object类里面的,按住Ctrl键然后点击equals选 Object implements就可以看到这个类内容,里面还有其他的类。也可以被接口定义。
抽象类与接口区别