JAVA 接口与接口、接口与父类之间方法同名

  • Post author:
  • Post category:java




接口成员的特点

  1. 成员变量 只能是常量。默认修饰符 public static final
  2. 成员方法 只能是抽象方法。默认修饰符 public abstract
  3. 默认方法和静态方法必须是public



java8接口变化

  1. 在接口中可以添加使用 default 关键字修饰的非抽象方法。即:默认方法(或扩展方法)
  2. 接口里可以声明静态方法,并且可以实现。(接口静态方法不会继承给实现类)


基本函数式接口:

  • 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. 接口中如果有静态重名方法,对实现类没有任何影响。因为接口静态方法不能被实现类继承。

  2. 父类中含有同名静态方法,会与从接口中继承的抽象方法或者默认方法冲突,所以会报错(除非接口中是同名的静态方法)。

  3. 其他情况,均继承父类方法,即类优先原则。



实现的多个接口中有同名方法



1. 两者均是抽象方法

需要实现该方法,实现的是implements靠前的接口方法,实现的方法体同时也实现了另一个接口。



2.一个为抽象方法,一个为默认方法

必须在实现类中重写该方法。

有一种特殊情况:即两个接口是父子关系,且默认方法在子接口当中,此时不需要重写该方法,直接继承子接口默认方法。



3. 两者均是默认方法

必须在实现类中重写该方法**。存在一种特殊情况,即两个接口是父子关系,此时不需要重写该方法,直接继承子接口默认方法。**



4. 一个或者两个为静态方法

上面已经叙述,静态方法对实现类没有任何影响,只需要考虑另一个接口即可。



5. 将某一个接口替换为抽象类

因为抽象类只有抽象方法,所以前2条规则对于抽象类和接口方法重名同样适用。



总结

  1. 接口静态方法对实现类无影响,同上述。

  2. 若两个接口之间存在父子关系,以子接口内的函数为准。

  3. 其余情况,均需要重写函数。



方法重名且抛出不同异常



重写与重载


重写原则:两同两小一大

两同:

1.方法名相同

2.形参列表要相同

两小:

1.抛出的异常类型小于等于父类方法抛出的异常类型,也就是要么是原来的异常类型(相等),要么是原来异常类型的子类(更小)

2.返回值类型要小于等于比父类的返回值类型,也就是要么返回原来的返回值类型(相等),要么是原来的返回值类型的子类(更小)

一大:

子类重写的方法的访问权限要大于等于父类方法的访问权限:


重载原则:两同一不同

两同:

1.重载发生在同一个类中,

2.跟继承没有关系.

一不同:

形参列表不同



重名方法抛出不同异常

对于父类与接口或者接口与接口中的同名方法。抛出了不同类型的异常(不是父子类),不能直接继承父类中的方法,因为父类中的方法抛出的异常和接口中不同,不符合重写的规则。

必须在实现类中重写函数,而且不能抛出任何异常

。因为不抛出异常被认为是比抛出异常“小”,所以符合重写的规则。



方法重名总结

  1. 接口静态方法对实现类无影响,只需要考虑另一方的影响。

  2. 接口之间若无父子关系,则需要重写同名方法。否则,以子接口中的方法为准。

  3. 父类成员函数与接口中方法同名时,继承类中的方法。类优先原则

  4. 父类静态函数与接口中方法同名时(非接口静态函数),发生冲突,报错。

  5. 当重名函数抛出不同异常时,必须在实现类中重写函数,而且不能抛出任何异常。



父类子类实现同一个接口

在这里插入图片描述

因为子类继承同一接口,并不需要实现,可以使用父类继承的方法提供实现。子类继承接口用于

提醒以及动态代理

如果子类不实现接口,在不使用接口代理的情况下毫无差别,使用接口代理没有显示的实现会报错。Java提供的实现动态代理的使用方法,主要是 Class.getInterfaces()只返回。它实现的接口,不会返回父类实现的接口。



版权声明:本文为qq_41775852原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。