接口的确很不好理解!!!!!那我来好好总结一下:
首先要理解接口是一个独立存在的,和类是不一样的东西,所以,直接用接口的定义是:
访问权限控制符 interface 接口名 [extends 接口列表] {
常量;//接口中的变量都是默认以public static final修饰的
抽象方法;//接口中的方法默认都是以public abstract修饰的,,注意!!!abstract 和private final static 并存
内部类;//接口中可以有内部类
静态方法;//jdk8支持
默认方法;//jdk8支持
}
1 package com.xt.imp.test;
2
3 public interface Animals {
4
5 public static final int I=0;
6
7 public abstract void eat();
8
9 class heart{
10
11 }
12
13 public static void sleep() {
14
15 }
16
17 public default void work() {
18
19 }
20 }
访问权限控制符:只能是public 和友好的 接口名和public 修饰的接口名一致
[extends 接口列表]代表:接口可以多继承接口,不能 继承类,对比之前的类只能单继承类
1 package com.xt.imp.test;
2
3 public interface IA extends IMammal,IB {//接口可以多继承接口,不能 继承类,对比之前的类只能单继承类
4
5 }
6
7 interface IB{//接口前面的访问控制符只能是public 友好的,public修饰的只能在单个文件里
8
9 }
接口中没有构造方法,而抽象类有构造方法,抽象类不能被实例化,但是可以继承其构造方法
接口中没有 静态代码块,非静态代码块
类可以 实现多个接口。
实现接口中的抽象方法,必须严格按照重写的规则
1 package com.xt.imp.test;
2
3 public class Whales implements IMammal,Animals {//类可以实现多个接口
4
5 @Override
6 public void move() {
7 System.out.println("移动。。。");
8 }
9 public static void main(String[] args) {
10 System.out.println(IMammal.i);
11 }
12
13 //实现接口中的抽象方法,必须严格按照重写的规则
14 @Override
15 public void eat() {
16
17 }
18
19 }
如果一个类实现了一个接口,但但没有实现接口中的所有抽象方法,那么这个类必须是abstract类。
如果多个接口中定义了相同的抽象方法,则在实现类中只实现其中一个即可
接口回调描述的是一种现象:接口声明的变量指向其实现类实例化的对象,那么该接口变量就可以调用接口中的抽象方法。
接口没有构造方法,不能创建自己的对象,但是可以引用实现类的对象
1 package com.xt.imp.test;
2
3 public class Studens implements IMammal {
4
5 public static void main(String[] args) {
6 IMammal im = new Studens();
7 System.out.println(im.i);
8 im.move();
9 }
10
11 @Override
12 public void move() {
13 System.out.println("移动。。");
14 }
15 }
函数式接口:
1 package com.xt.imp.test;
2
3 @FunctionalInterface
4 public interface FunctionInterface {
5
6 void ran();
7 }