1 抽象类
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。
一个抽象类中,可以有0~n 个抽象方法,以及0~n 个具体方法。
抽象方法
- 设计抽象方法的目的就是让子类来实现,否则抽象方法就没有任何意义。
- 如果一个方法被声明为抽象的,那么这个类也必须声明为抽象的。
抽象类规定
- 抽象类不能被实例化,如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
- 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
- 抽象类中的抽象方法只有声明,不包含方法体。
- 构造方法、静态方法不能声明为抽象方法。
- 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。
2 接口
接口在Java编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。
接口和抽象类一样,无法被实例化
。
接口规定
- 接口不能用于实例化对象,接口没有构造方法。
- 接口中的变量会被隐世的指定为
public static final
常量。 - 一个类可以实现多个接口。
- 除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。
- 接口允许多继承。
接口新特性
JDK 1.8 以后,接口里可以有静态方法和默认方法。默认方法使用 default 关键字修饰。
JDK 1.9 以后,允许将方法定义为私有,使得某些复用的代码不会把方法暴露出去。
实现接口时,默认方法可以根据需要有选择地实现/重写。静态方法不需要实现,实现类中不能拥有接口中的静态方法。
私有方法的出现解决了两个默认方法或者静态方法中包含一段相同的代码而产生冗余的问题,将这段代码抽取成一个共性方法,而这个共性方法不需要让其他类使用,因此私有化隐藏起来
3 抽象类和接口的区别
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
- 接口中不能含有静态代码块以及构造代码块,而抽象类可以。
- 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
- 接口中不能有构造方法,抽象类可以,抽象类也可以有main方法,同时可以运行它。
- 一个类可以实现多个接口,但是只能继承一个抽象类。