1.抽象类
1.1 定义
一个类中没有描述对象的具体信息,这样的类被称作抽象类。它是一种特殊的类,不能被实例化。
抽象类是用 abstract
关键字修饰的类。
抽象类中可以包含抽象方法和具体方法。抽象方法是没有方法体的方法。
抽象类的存在主要是为了被继承,为子类提供一个统一的框架。
1.2 语法规则
抽象类用abstract
关键字修饰,例如public abstract class Shape
。
抽象类中可以包含普通方法、属性和构造方法:
抽象方法用abstract
修饰,如 public abstract void draw();
。
1.3 特性
- 不能直接实例化对象。
- 抽象方法不能是
private
的,也不能被final
和static
修饰。 - 抽象类必须被继承,子类要重写父类中的抽象方法,否则子类也是抽象类。
- 抽象类中不一定包含抽象方法,但有抽象方法的类一定是抽象类。
- 抽象类中可以有构造方法,供子类创建对象时初始化父类的成员变量。
1.4 作用
抽象类相当于多了一重编译器的校验,可以预防出错。
例如,实际工作不应该由父类完成而应由子类完成时,使用抽象类可以避免误用父类。
2.接口
2.1 定义
接口是多个类的公共规范,是一种引用数据类型,定义了一组行为规范,实现类必须遵守。
2.2 语法规则
接口用interface
关键字定义,例如public interface IUSB
。
接口中的方法默认是public abstract
的,成员变量默认是public static final
的。
2.3 使用条件
接口不能直接使用,必须有一个实现类来实现接口中的所有抽象方法。
类与接口之间是implements
实现关系。
例如,定义USB接口IUSB
,鼠标类Mouse
和键盘类KeyBoard
实现该接口,笔记本类Computer
使用USB设备。
2.4 特性
- 不能直接new接口的对象。
- 接口中的方法默认是
public abstract
的,不能有其他修饰符。 - 接口中的方法不能在接口中实现,只能由实现接口的类来实现。
- 重写接口中方法时,不能使用默认的访问权限。
- 接口中的变量默认是
public static final
的。 - 接口中不能有静态代码块和构造方法。
- 接口编译完成后字节码文件的后缀格式也是
.class
。 - 如果类没有实现接口中的所有抽象方法,则类必须设置为抽象类。
- JDK 8中接口可以包含
default
方法。
2.5 接口的实现与继承
一个类可以实现多个接口,例如Bird
类继承Animals
类,同时实现Isflyable
和Isrunable
接口。
接口与接口之间可以多继承,用extends
关键字实现接口继承一个接口。
3.抽象类和接口的区别
1.抽象类的方法和属性都没有默认的修饰符
2.接口的方法默认添加abstract修饰符,属性默认添加public static final修饰符
3.抽象类中可以有抽象方法也可以有非抽象方法
4.抽象类只能被继承,是单继承
5.接口可以被接口继承,是多继承
6.抽象类通过extends
继承,接口通过implements
实现。
设计理念:抽象类侧重于“是一种什么”的关系,接口侧重于“能做什么”的关系。
4.注
关于接口、抽象类、普通类的常见问题:
- 抽象类【可以】继承普通类
- 抽象类【可以】实现接口
- 接口【不可以】实现接口
- 抽象类【不可以】继承接口
- 抽象类【可以】继承抽象类
- 接口【不可以】继承抽象类
- 普通类【不可以】继承接口
5.Final修饰符
最终的 最后的
final可以修饰类 属性 方法 变量
修饰类:该类不能被继承(不能有子类)
修饰属性:该属性是一个常量,常量必须有初始值,值不能被改变
修饰方法:该方法不能被重写,子类可以继承父类的抽象方法
修饰变量:可以不赋予初始值,一旦赋值后,不能改变
[属性—>类 变量->方法 方法结束变量销毁]
6.interface接口特点
1.接口使用interface来定义,接口不是类
2.接口中的所有方法,都必须是抽象方法->抽象:没有方法体,默认添加abstract
3.接口中所有的属性都是常量,常量:初始值无法改变,属性默认添加static final
4.接口不能创建对象
5.一个类要实现接口,需要使用implements关键字连接
6.一个类可以实现多个接口,接口名与接口名之间以逗号间隔,必须实现接口里的所有方法
7.一个类,既有继承,又有实现,的时候。必须是先继承后实现的顺序。
8.接口可以继承接口,而且可以多继承