抽象类和抽象方法用abstract关键字修饰
1、抽象类
1.1、抽象类和抽象方法的定义规则
- 抽象类和抽象方法必须使用abstract修饰符修饰,抽象方法只有方法签名,没有方法体
- 抽象类不能实例化,无法使用new关键字创建实例,即使抽象类里面不包括抽象方法,也不能创建实例,只能被当作父类继承
- 抽象类可以包含的5种成分,方法(普通方法、抽象方法)、构造器、初始化块、内部类、成员变量,构造器不能用于创建实例主要用于被子类调用
- 含有抽象方法的类只能被定义为抽象类
1.2 abstract和final、static
- 用abstract修饰的类只能被继承,修饰的方法必须由子类重写,final修饰的类不能被继承,修饰的方法不能被重写,abstract、final不能同时使用
- 使用static修饰一个方法时,表明这个方法属于类本身,如果将该方法定义为抽象方法,通过类调用会失败,abstract、static不能同时使用
1.3 抽象类的作用
- 不能创建实例,只能当成父类继承
- 体现了模板模式,模板模式简单规则
- 抽象父类可以只定义需要使用的某些方法,把不能实现的部分抽象成抽象方法,留给子类实现
- 父类中可能包含需要调用其他系类的方法,这些调用方法既可以由父类实现,也可以由子类实现,父类提供一个通用算法
2、接口
接口体现的是规范和实现分离的哲学,接口通常定义一组公用方法
2.1、接口的定义
- 使用interface关键字
- 修饰符可以是public,或者采用默认的包权限访问控制符
- 一个接口可以有多个直接父接口,但接口只能继承接口,不能继承类
- 不能包含构造器和初始化块定义,接口里可以包含成员变量(静态变量),方法(抽象实例方法、类方法或者默认方法)、内部类,所有成员必须是public修饰,
- 接口里定义成员变量,总是使用public static final修饰;
- 接口里定义普通方法,总是使用public abstract修饰,普通方法不能有实现,类方法和默认方法必须有实现
2.2、接口的继承
- 接口支持多继承,接口不能用于创建实例,但是可以用于声明引用类型变量
- 一个类可以继承一个父类,同时实现多个接口,implements部分必须放在extends部分之后
3、接口和抽象类的区别
3.1 相同点
- 两者都不能被实例化
- 两者都可以包含抽象方法,实现接口或继承抽象类的普通子类必须实现这些抽象方法
3.2 不同点
- 接口里只能包含方法,成员变量、内部类三种成分,并且方法只能是抽象方法或者是默认方法,不能包含普通方法,抽象类可以包含普通方法
- 接口里不能包含构造器,抽象类可以包含构造器,但是抽象类里的构造器不是用于创建对象,而是让其子类调用这些构造器创建子类实例
- 一个类只能有一个直接父类,包括抽象类,但是一个类可以实现多个接口