接口
接口是一种能力
- 体现在方法上,接口中拥有的方法就可以说拥有某种能力
接口是一种约定
- 体现在接口的名称和注释上:有些接口只有名称;方法的实现方式要通过注释来约定
- 面向接口编程:程序设计时面向接口的约定不考虑方法具体实现
为什么需要接口?
- 接口就是比抽象类还抽象的抽象类,可以更加规范对子类实现的约束,全面的专业的实现了:规范和具体实现的分离
- 接口就是规范,定义了一组规则,体现了现实世界中如是你是…则必须能的思想。例如如果你是天使,你就必须会飞。
- 接口的本质是契约,就是我们人间的法律一样,制定了就要去遵守
- 项目的具体需求是多变的,我们只能以不变应万变,这里的不变就是规范,因此我们开发往往是面向接口编程。
接口相关规则
- 接口的方法都是抽象
- 即使没有显式的将接口中的成员用public标示,也是public访问类型
- 接口中的变量默认是public static final标识,所以接口中定义的变量都是全局静态常量
- 可以定义一个新接口,用extends继承另一个已存在的接口
- 可以定义一个类,用implements去实现接口中的所有方法
- 可以定义一个抽象类,用implements去实现接口中的部分方法
- 如何定义接口?
格式:
[访问修饰符] interface 接口名 [extends 父接口1,父接口2…]
常量定义:public static final 数据类型 常量名
方法定义:public abstract 返回值类型 方法名
1.8以后方法定义可以有:
default 返回值类型 方法名(参数列表){方法体}
public static 返回值类型 方法名(参数列表){方法体} - 如何实现接口
子类通过implements实现接口中的规范
接口不能够实例化,但是可用于声明引用变量类型
一个类实现了接口,必须实现接口中所有方法,并且这些方法都是public
Java是单继承,但是接口可以多继承
抽象类
抽象类概念
- Java中的对象是对现实世界的具象化,但是在现实世界中,某些类并不具备实例化的意义,因此可以定义为抽象类
抽象类的使用说明
- 创建抽象类需要关键字abstract
- 抽象类可以定义属性和构造函数
- 不能进行实例化,不可以new对象
- 抽象类中的某些方法需要子类进行更丰富的实现,父类实现没有意义,此时可以将抽象类中的方法定义为抽象方法,没有具体的实现,只包含方法名称,参数列表,返回值类型,访问修饰符
- 使用abstract关键字修饰的方法是抽象方法,可以不写方法的实现
- 子类在继承抽象类的时候需要关键字extends,必须要实现抽象父类中的抽象方法,如果将子类定义为抽象类,可以不实现抽象父类中的抽象方法
- 有抽象方法的一定是抽象类,但是抽象类不一定有抽象方法
接口和抽象类的区别?
- 抽象类中的方法可以有普通方法和抽象方法,而接口中只能有抽象方法,但是在jdk1.8中,接口也可以有静态方法和default修饰的方法,但是必须要有方法体
- 抽象类需要使用extends关键字来修饰,而接口是使用interface关键字来修饰
- 子类使用extends来继承抽象类,使用implements实现接口
- 子类继承抽象类的时候必须实现全部抽象方法,可以不实现普通方法,而接口中的方法必须全部实现(不包括静态方法和default方法)
- 抽象类中可以定义成员变量,接口中只能定义全局静态常量
- 抽象类在子类继承的时候是单继承,接口支持多继承(子类可实现多个接口)
- 抽象类和接口都不能够实例化,但是抽象类可以定义构造方法,而接口是不可以的。
- 抽象类可以实现接口,并且可以不实现接口中的方法,而接口只能继承接口,不可以实现接口
- 注:在实际的项目开发中,如果可以用接口尽量使用接口,将单继承的父类留在最关键的地方。
实例
public interface A{
void test01();
public static void staticMethod(){
System.out.println("我是静态方法");
}
default void defaultMethod(){
System.out.println("我是默认方法")
}
}
public interface B{
void test02();
}
public class ASon implements A{
@Override
public void test01(){
System.out.println("我是test01");
}
}
public class ABSon implements A,B{
@Override
public void test01(){
System.out.println("我是test01");
}
@Override
public void test02(){
System.out.println("我是test02");
}
}
public abstract class AbstractSon implements A{
}
public interface A extends B{
}
public abstract class AbstractClass{
private String filed1 = "filed";
public AbstactClass(String filed1){
this.filed1 = filed1
}
public abstract void test01();
public void test02(){
System.out.println("我是测试方法02");
}
}
public class extends AbstractClass{
@Ovrride
public void test01(){
System.out.println("我是测试方法01");
}
}
public abstract class extends AbstractClass{
}