接口
这里面主要涉及一个版本更新带来的静态方法、默认方法、私有方法,先说概念。
概念:接口是Java语言中的一种引用类型,是方法的集合。如果说类的内部封装了成员变量、构造方法和成员方法,那么接口的内部主要就是封装了方法。
-
JDK1.7及之前是 只有抽象方法
-
JDK1.8 新增默认方法(default)以及静态方法(static)
- 上述的静态和默认方法都可以有方法体,但是只有默认方法可以被继承使用,而静态方法是属于接口的,不可以被子类使用。
- JDK9 新增私有方法(private)
- 如果一个接口中有多个默认方法,并且方法中存在重复的内容,那么可以抽取出来,封装到私有方法中,供默认方法去调用,从设计的角度讲,私有的方法是对默认的方法和静态的方法的辅助。
多态
概念:所谓多态就是指引用变量和调用哪个类的方法在编程期间不能确定,只有在程序运行期间才可以确定该引用变量到底指向哪个类的实例对象、调用哪个实例对象的方法。
实现多态的前提条件:
- 子类与父类的继承关系之间
- 实现类与接口的实现之间
什么是多态机制?Java语言是如何实现多态的?
程序在编写期间并不能确定当前的引用变量指向哪个子类的实例对象,调用哪个方法。只有在程序运行期间才可以确定,当父类引用指向了子类的对象,并且子类对象重写了父类中的方法,就可以实现多态。接下来如果要实现其他类的方法,只需要更改当前引用变量的指向即可,指向不同的子类,这样让程序可以选择多个运行状态,就是多态性。
实现:只需要父类引用指向子类对象,然后子类重写父类中的方法。
抽象类与接口的对比
共同点:
- 两者都不能实例化;
- 都位于继承的顶端,都可以被其他类继承或者实现;
- 都包含抽象方法(一般来说抽象类都会定义抽象方法),都需要被重写。
不同点:
抽象类 | 接口 |
---|---|
抽象类用abstract关键字声明 | 接口用interface声明 |
继承抽象类用extends | 实现接口用implements |
可以定义构造方法 | 不可以定义构造方法 |
访问修饰符可以有多种 | 访问修饰不能定义为protected |
成员属性可以是多种访问修饰符 | 只能定义常量,默认为public static final修饰 |
对于抽象类和接口,我们如何选择?
- 当你需要定义一个通用的功能,希望这些代码被子类共有、得以复用,那就使用抽象类。
- 当你只希望定义一些抽象的行为,并且不同的类有不同的实现版本,尽量用接口。
抽象类能使用 final 修饰吗?
答:不可以。抽象类本身的寓意就是不完全的,希望子类继续扩充、具体完善的,但是使用了final修饰,就表示这个类语法上不能被继承,同时寓意上也表示这是个完全形态的类,抽象类本身的寓意和final的寓意彼此也是矛盾的。
访问修饰符顺便提一下