抽象类和方法
创建一个抽象类,是为了通过接口控制一系列的类, 而它自身的接口并不需要有什么意义
抽象方法: 只有方法,没有具体的方法体(没有{})
所有的抽象方法的访问权限全是public或者friendly
抽象类: 被abstract修饰, 有抽象方法的类必为抽象类
抽象类没法创建对象, 只能通过子类来创建, 前提是子类重写了所有父类的抽象方法, 不然的话,子类也是抽象类, 也会被强制加上abstract关键字,子类重写方法,虽然不强制用@override 但是最好还是加上(idea直接会帮我们操作的)
接口的创建
接口是介于方法之下,类之上的存在, 它也约束了行为,只提供形式,并没有具体的实现, 它的方法就是抽象方法(abstract关键字自动被省略了, 且是public的,这样接口的实现就可以有权限访问), 接口也可以有属性, 属性隐式为为static或者final的,接口被用来定义类之间的协议,其实接口就像是一种特殊的集成
default关键字
在java8以后,default关键字不再只是用于switch, 它还可以用于接口默认方法实现
// interfaces/InterfaceWithDefault.java
interface InterfaceWithDefault {
void firstMethod();
void secondMethod();
default void newMethod() {
System.out.println("newMethod");
}
}
这样修饰以后不会影响接口的正常使用, 而且其实现类还可以调用接口newMethod()
默认方法有时候也叫守卫方法/虚拟扩展方法
接口的多实现
不同于类, 接口是可以多实现的, 但是被实现的方法中如果存在相同方法签名(方法名及参数列表)时, 就会报错,因为机器不知道要调用那个方法, 不过如果你在实现类中重写了这个有歧义的方法,就不会报错,因为它知道该调用哪个方法
import java.util.*;
interface Jim1 {
default void jim() {
System.out.println("Jim1::jim");
}
}
interface Jim2 {
default void jim() {
System.out.println("Jim2::jim");
}
}
public class Jim implements Jim1, Jim2 {
@Override
public void jim() {
Jim2.super.jim();
}
public static void main(String[] args) {
new Jim().jim();
}
}
输出: Jim2::jim
接口中的静态方法
用来写工具类用,也是java8加进来的
接口与抽象类的区别
策略设计模式
针对传入参数的类型不同, 而产生不同行为的设计模式叫策略设计模式
多接口结合
接口没有任何实现,也就是没有接口相关的存储, 因此可以实现多接口
impl承单一抽象类可以包含属性,非抽象方法可能引用这些属不能包含属性(除了静态属性,不支持对象状态)状态性默认方法和抽象方不需要在子类中实现默认方法,默认方法可以引用其他接口的方必须在子类中实现抽象方法法法构造器没有构造器可以有构造器可以是protected或友元可见性隐式public
策略设计模式
针对传入参数的类型不同, 而产生不同行为的设计模式叫策略设计模式
多接口结合
接口没有任何实现,也就是没有接口相关的存储, 因此可以实现多接口
先extend,再implements 后面的接口用”,”隔开
接口可以多继承,也就是说一个接口可以继承多个接口
接口的实现类可以进行向上转型成接口, 也就是说一个方法的入参如果是接口, 那么它的实现类是可以作为参数传进方法的
这就引申出来接口存在的意义,就是其实现类可以向上转型, 同时它还限定了不可以创建其对象