文章目录
接口成员的特点
- 成员变量 只能是常量。默认修饰符 public static final
- 成员方法 只能是抽象方法。默认修饰符 public abstract
- 默认方法和静态方法必须是public
java8接口变化
- 在接口中可以添加使用 default 关键字修饰的非抽象方法。即:默认方法(或扩展方法)
- 接口里可以声明静态方法,并且可以实现。(接口静态方法不会继承给实现类)
基本函数式接口:
- Function<T, R>:接受一个入参T,返回R类型对象,使用apply方法获取方法执行的内容
- Consumer:接受一个参数T,没有返回值,使用accept方法对参数执行操作
- Supplier:没有入参,返回T类型结果,使用get方法获取返回结果
- Predicate:接受一个入参,返回结果为true或者false,使用test方法进行测试并返回测试结果
- UnaryOperator(Function子接口):参数为T,对参数为T的对象进行一元操作,并返回T类型结果,其中方法为T apply(T t)
- BinaryOperator(BiFunction子接口):参数为T,对参数为T得对象进行二元操作,并返回T类型得结果,其中方法为T apply(T t1, T t2)
静态方法的特性
在父子类继承中:
父类静态方法可以被继承,但是不能被重写。静态属性、静态方法和非静态的属性都可以被继承和隐藏而不能被重写,
因此不能实现多态,不能实现父类的引用可以指向不同子类的对象,然后调用不同子类的静态方法
。
父类引用只能调用父类静态方法、父类静态属性和父类实例属性
。非静态方法可以被继承和重写,因此可以实现多态。
在接口继承中:
接口静态方法不会继承给实现类,实现类无法调用接口静态方法。接口静态方法只能通过接口名.静态方法名调用。
接口和父类的方法重名
1. 接口:抽象方法,父类:成员方法
如果子类中没有实现方法体,则子类继承父类的方法,同时此方法对应了接口中的方法。
如果子类实现了接口方法,实际上是对父类方法的重写,同时此方法对应了对应了接口方法。
2. 接口:默认方法,父类:成员方法
类优先原则。子类中继承父类的方法,抛弃接口中的默认方法。
3. 接口:静态方法,父类:成员方法
接口静态方法不会继承给实现类。所以子类继承父类方法。
4. 接口:抽象方法,父类:静态方法
报错,父类中的静态方法与接口中继承的抽象方法冲突。
5. 接口:默认方法,父类:静态方法
报错,子类继承了接口的默认方法,但是该默认方法与从父类继承的静态方法冲突。
6. 接口:静态方法,父类:静态方法
接口静态方法不会继承给实现类。所以子类继承父类静态方法。
总结:
-
接口中如果有静态重名方法,对实现类没有任何影响。因为接口静态方法不能被实现类继承。
-
父类中含有同名静态方法,会与从接口中继承的抽象方法或者默认方法冲突,所以会报错(除非接口中是同名的静态方法)。
-
其他情况,均继承父类方法,即类优先原则。
实现的多个接口中有同名方法
1. 两者均是抽象方法
需要实现该方法,实现的是implements靠前的接口方法,实现的方法体同时也实现了另一个接口。
2.一个为抽象方法,一个为默认方法
必须在实现类中重写该方法。
有一种特殊情况:即两个接口是父子关系,且默认方法在子接口当中,此时不需要重写该方法,直接继承子接口默认方法。
3. 两者均是默认方法
必须在实现类中重写该方法**。存在一种特殊情况,即两个接口是父子关系,此时不需要重写该方法,直接继承子接口默认方法。**
4. 一个或者两个为静态方法
上面已经叙述,静态方法对实现类没有任何影响,只需要考虑另一个接口即可。
5. 将某一个接口替换为抽象类
因为抽象类只有抽象方法,所以前2条规则对于抽象类和接口方法重名同样适用。
总结
-
接口静态方法对实现类无影响,同上述。
-
若两个接口之间存在父子关系,以子接口内的函数为准。
-
其余情况,均需要重写函数。
方法重名且抛出不同异常
重写与重载
重写原则:两同两小一大
两同:
1.方法名相同
2.形参列表要相同
两小:
1.抛出的异常类型小于等于父类方法抛出的异常类型,也就是要么是原来的异常类型(相等),要么是原来异常类型的子类(更小)
2.返回值类型要小于等于比父类的返回值类型,也就是要么返回原来的返回值类型(相等),要么是原来的返回值类型的子类(更小)
一大:
子类重写的方法的访问权限要大于等于父类方法的访问权限:
重载原则:两同一不同
两同:
1.重载发生在同一个类中,
2.跟继承没有关系.
一不同:
形参列表不同
重名方法抛出不同异常
对于父类与接口或者接口与接口中的同名方法。抛出了不同类型的异常(不是父子类),不能直接继承父类中的方法,因为父类中的方法抛出的异常和接口中不同,不符合重写的规则。
必须在实现类中重写函数,而且不能抛出任何异常
。因为不抛出异常被认为是比抛出异常“小”,所以符合重写的规则。
方法重名总结
-
接口静态方法对实现类无影响,只需要考虑另一方的影响。
-
接口之间若无父子关系,则需要重写同名方法。否则,以子接口中的方法为准。
-
父类成员函数与接口中方法同名时,继承类中的方法。类优先原则
-
父类静态函数与接口中方法同名时(非接口静态函数),发生冲突,报错。
-
当重名函数抛出不同异常时,必须在实现类中重写函数,而且不能抛出任何异常。
父类子类实现同一个接口
因为子类继承同一接口,并不需要实现,可以使用父类继承的方法提供实现。子类继承接口用于
提醒以及动态代理
。
如果子类不实现接口,在不使用接口代理的情况下毫无差别,使用接口代理没有显示的实现会报错。Java提供的实现动态代理的使用方法,主要是 Class.getInterfaces()只返回。它实现的接口,不会返回父类实现的接口。