Java接口与抽象类
接口
接口是一种引用的数据类型,最重要的内容就是其中的抽象方法
创建格式
1 | public interface api { |
换了关键字interface
之后,编译生成的字节码文件仍然是.java -> .class
Java 7开始,接口中可以包含的内容有:
常量
抽象方法
Java 8 开始,那么可以包含的还有:
默认方法(重点:为什么要引入默认方法?)
静态方法
Java 9 开始:还能有
- 私有方法
抽象方法
注意:
- 接口不能直接使用,必须有一个实现类来实现该接口
- 接口的实现类必须覆盖重写接口的所有抽象方法
- 实现类一般起名字在最后加上
Impl
- 接口的抽象方法的关键字必须是固定的两个
public void
,但是他们可以省略接口和实现类继承时使用1
2
3
4public interface api {
public abstract void method();
void method2(); // 这两个方法的定义效果一样
}implements
实现1
2
3
4public interface api {
public abstract void method();
}
//接口1
2
3
4
5
6
7public class apiImpl implements api {
public void method(){
System.out.println("实现类的使用");
}
}
//实现类默认方法
Java 8开始就可以在接口中定义默认方法
目的是为了解决接口升级的问题,因为在投入使用后,如果给接口新加抽象方法会报错,这时候可以使用默认的接口方法
默认方法的特点就是,可以重写,也可以不重写
1 | public interface api { |
1 | public class apiImpl implements api { |
静态方法
Java 8开始:同样,接口的静态方法也是属于这个接口的,调用时直接使用接口名调用即可
1 | public interface api { |
1 | public static void main(String[] args) { |
私有方法
Java 9出现的接口的私有方法
目的:是为了简化接口中默认方法的重复部分
1 | public interface api { |
常量
接口中可以定义成员变量,但是必须使用public static final
三个修饰符来修饰(可以省略)
1 | public static final int NUM = 10; |
注意:常量一般要完全大写,而且多单词要用下划线进行分隔
同样常量属于接口,可以直接用接口名调用
1 | public static void main(String[] args) { |
接口与类的区别
实现接口与实现类的区别:
- 接口没有静态代码块、接口没有构造方法
- 一个类的直接父类是唯一的,但是一个类可以实现多个直接接口
1 | public class MyInterfaceImpl implements MyinerfaceA,MyinterfaceB{ |
- 如果实现类实现的多个接口存在方法同名的情况,只需要覆盖重写一次即可
- 如果没有覆盖重写所有的抽象方法,那么本类也只能是一个抽象类
- 如果多个接口存在重复的默认方法,实现类也要对其覆盖重写
- 一个类如果直接父类和接口当中的方法产生了冲突,会优先使用父类当中的方法
接口继承接口
- 接口之间可以多继承
- 多个父接口抽象方法同名没有关系
- 多个父接口的默认方法同名必须进行默认方法的覆盖重写
抽象类
定义:加关键字abstract
1 | public abstract class dog { |
注意:
- 抽象方法没有实现体
- 只有抽象类才能拥有抽象方法
- 不能直接
new
抽象对象 - 必须用子类来继承抽象父类
- 子类必须覆盖重写抽象父类的所有的抽象方法,如果没有实现完所有的方法,那么这个子类还是一个抽象类
- 抽象类不能创建对象
- 抽象类可以有构造方法,供子类创建对象时初始化父类对象
1 | public abstract class father { |
1 | public class son extends father { |
1 | public static void main(String[] args) { |
- 抽象类不一定含有抽象方法,但是含有抽象方法的一定是抽象类