Java基础--接口和抽象类的区别(接口中的默认,静态,私有方法)的学习笔记
接口与抽象类的区别
相同点
- 接口的实现或抽象类的子类需要实现接口或抽象类中相应的方法才能被实例化。
- 接口和抽象类不可以被实例化。
不同点
- 抽象类可以有构造方法,而接口不可以有。
- 既然抽象类并不能实例化,那抽象类中的构造函数存在的意义是什么?
- 抽象类必须被子类继承来实现。
- 子类在调用父类时,无论自己有没有构造方法都会先去执行父类无参的函数,哪怕父类是抽象类。虽然抽象类不能被实例化,但是可以在构造方法中初始化一些参数,也可以在子类中调用父类的构造方法。
- 既然抽象类并不能实例化,那抽象类中的构造函数存在的意义是什么?
- 抽象类的成员变量可以是常量,也可以是非常量;而接口的变量只能是常量,接口中的变量会被隐式的被public static final来修饰(并且只能用public static final来修饰)。
- 抽象类的成员方法:既可以有普通方法也可以有抽象方法;而接口在jdk1.7只能包含抽象方法,默认修饰符:public abstract,在jdk1.8可以有默认方法和静态方法,在jdk1.9可以有私有方法。
- 一个类可以实现多个接口,但只能继承一个类。
- 声明接口的关键字是interface,实现接口的关键字是implements,与抽象类的关键字不同。
- 设计理念不同:接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。抽象类表示的是,这个对象是什么。是“A is a B”,接口表示的是,这个对象能做什么,表示“A is like B”。例如:防盗门是个门,同时它还有密码锁的功能,此时可以如此设计:防盗门继承了门这个抽象类,并且实现了密码锁的功能。
接口中的方法
JDK1.7
- 在jdk1.7中,接口只能拥有抽象方法(没有方法体的方法),子类想要实现接口,必须实现接口中所有的抽象方法,即使子类并不需要这个方法。并且如果一个接口新增了一个方法,那么所有实现了这个接口的类都要去修改,实现它的这个新方法。
JDK1.8
- 在jdk中1.8中,加入了由default修饰的默认方法,该方法可以使得实现类在不需要使用该方法时,不用去重写空实现,需要该方法时,才去重写默认方法;同时接口新增方法时,也可以先将新增方法设置为默认方法,避免产生大量修改。
- jdk1.8还加入了由static关键字修饰的静态方法,通过static关键字修饰的方法在接口中不可被修改。一些不想被扩展覆盖的方法就可以用static修饰。
- 注意点:
- 接口默认方法、静态方法可以有多个。
- 默认方法通过实例调用,静态方法则通过接口名调用。
- default默认方法关键字只能用在接口中。
- 静态方法不能被继承及覆盖,所以只被具体所在的接口调用。
- 默认方法可以被继承,如果继承了多个接口,多个接口都定义了多个同样的默认方法,实现类需要重写默认方法否则会报错。
JDK1.9
- JDK1.9之后,接口又加入了由private修饰的私有方法,当两个默认方法或者静态方法中包含一段相同的代码实现时,程序必然考虑将这段实现代码抽象成一个共性方法,而这个共性方法是不需要让别人使用的,因此用私有给隐藏起来了,这就是增加私有方法的必然性。
- 默认方法可以调用私有的静态方法和非静态方法。
- 静态方法只能调用私有的静态方法。
- 私有方法只能在接口中调用。
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.