JAVA基础复习总结---------接口与抽象类小结
1.接口
绪论
接口是用来描述类具有什么功能,而并不给出每个功能的具体实现,一个类可以实现多个接口,并在需要接口的地方,随时使用实现了相应接口的对象。---《Java核心技术卷1》
核心要点
上面的绪论几乎就将接口的核心知识概括完了。所以这里是一个详解。
- 描述。
- 接口不是类,是类型(typing)。类也是类型。
- 接口中不能实现任何方法,default 关键字是默认方法,不是实现。
- 接口没有构造器。所以不能使用 new 运算符实例化一个接口.
- 尽管不能构造接口的对象,却能声明接口的变量:接口变量必须引用实现了接口的类对象。
- 接口一定需要别的类实现,才能起到描述作用,所以导致了:
- 接口的修饰符只有以下几种:public,abstract,default(缺省(默认)情况下为 public),static,strictfp
- 接口中所有的域都是常量。所以域只能使用public static final。(注:现在已经拥有了Enum类,所以如果可以不要把常量写在接口中)
- 所有的方法自动属于public abstract(注:尽管如此,实现接口的类依然中的方法必须要把方法声明为public)
- 接口不是类,是类型(typing)。类也是类型。
- 接口的优点在于可以实现多个接口,这样是对多重继承的一种更好的替代品(毕竟C++中的多重继承给了程序员一个非常大的打击。)
注意的地方
- 接口中的默认方法
- 默认方法必须使用 default 去实现。
- 如果你在某个类实现了两个含有相同的方法的接口,并且其中一个方法拥有默认实现,那么就会出现接口冲突,编译器会报错提醒你去解决。
- 虽然我们允许接口中增加静态方法,但是因为这有违于接口作为抽象规范的初衷,所以Java类库将静态方法放在了伴随类中。
- 如:Path/Paths,Collection/Collections(加了一个s)
- 但是,现在既然允许了接口中添加静态方法,那么我们自己的代用就弃用了伴随类。
- 超类优先原则
- 如果一个类的父类和实现的接口中有相同的方法(名字,参数,签名),那么优先使用超类的方法。
- 所以千万不要在你的接口中定义:toString()之类的Object拥有的方法,因为绝对会被覆盖掉。
- 接口可以帮你实现完全解耦
2.抽象类
抽象类是由abstract修饰符修饰的类,而抽象方法必须在抽象类中。
抽象方法
抽象方法:拥有abstract修饰符,并且权限只有public(当我们不写public时,会自动添加一个public,所以protected和private 都不能修饰抽象方法)
public abstract class absClass { abstract void absMethod(); }
在接口中也可以包含抽象方法(接口内部只有抽象方法),但是接口不是类,所以能包含抽象方法的类只有抽象类。
抽象类
抽象类与普通类的比较:
1)抽象方法必须为public 或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省(default)情况下默认为public。
2)抽象类不能用来创建对象;
3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。
抽象类与接口的比较
但是抽象类和接口有很多有意思的异同点。
- 接口不是类,但是抽象类是类。虽然二者都不可以被初始化。
- 接口是对行为的抽象,抽象类是对类的抽象。也就是接口抽象的更为彻底。
- 抽象类作为很多子类的父类,它是一种模板式设计。接口是一种行为规范,它是一种辐射式设计。
- 抽象类除了抽象方法外和普通类没有区别,而接口则根本就不是类
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的,原因同上一条
- 抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;原因同上上一条
- 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
- 综上,抽象类是抽象弱化版的接口,接口是抽象强化的抽象类。当然我们可以这样心里想想,不可以告诉其他人,因为漏洞百出。
总结:
- 任何抽象性都应该是应真正的需求而产生的
- 恰当的原则应该是优先选择类而不是接口
- 接口是一种重要的工具,但是容易被滥用
相关知识点:
lambda 表达式:
内部类: