CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛
CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛
CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛

Java中的抽象类与接口(2)-免费源码丞旭猿

Java里面除了抽象类和接口的区别这种头疼并且不容易搞明白的问题还有很多很重要的问题并且有些也很好玩所以抽象类和接口到底有啥区别可以留到今后的工作中慢慢体会因为随着阅历的增长对对面向对象的理解和能熟练使用继承结构以后这将不再是个问题

有一个比较有意思的问题比这个有趣既然AbstractList实现了List接口那为什么ArrayList继承了AbstractList之后还要再实现List接口呢通过运行代码就能明白

public classTest1{public interfaceList{voidget();}public static abstract classAbstractListimplementsList{public abstract voidget();}public static classClass1extendsAbstractListimplementsList{@Overridepublic voidget() {System.out.println(“Class1.get()”);}}public static classClass2extendsAbstractList{@Overridepublic voidget() {System.out.println(“Class2.get()”);}}private static<T>Tinvoke(finalTobj) {finalInvocationHandler handler=newInvocationHandler() {@OverridepublicObjectinvoke(Objectproxy,Methodmethod,Object[] args)throwsThrowable{returnmethod.invoke(obj, args);}};return(T)Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(),handler);}public static voidmain(String[] args) {//这个可以调用成功List list1=invoke(newClass1());list1.get();//这个会抛异常,这是因为Class1隐式实现List,而Class2显示实现ListList list2=invoke(newClass2());list2.get();}}

可以看到Class1继承了AbstractList之后又显式实现了List接口Class2仅仅只是继承了AbstractList然后通过反射再重新声明Class1Class2回会发现Class2抛异常了——这就是为什么需要显式再实现一次List的原因——如果想要获取已实现接口的子类的动态代理那这个子类就必须显式实现接口

说直白点,就是没有直接实现接口的类用反射的时候就要小心了

另一个比较有趣而且面试的时候可能会问的比较多的问题会是下面关于类的多重继承问题

假设有如下条件

1、接口A和接口B拥有相同的方法

2、接口B继承接口A,C是独立接口

3、D有和A、B相同的方法

用代码来解释就是

public interfaceA{default voidhello() {System.out.println(“Hello from A”);}}

public interfaceBextendsA{default voidhello() {System.out.println(“Hello from B”);}}

public interfaceC{default voidhello() {System.out.println(“Hello from C”);}}

public classD{public voidhello() {System.out.println(“Hello from D”);}}

那么问题来了

1、类E同时实现A、B,会调用AB哪个父类接口的方法呢

public classEimplementsA,B{public static voidmain(String[] args) {newE().hello();}}

2、类E继承D,同时实现A、B,会调用ABD哪个父类的方法呢

public classEextendsDimplementsA,B{public static voidmain(String[] args) {newE().hello();}}

3、E同时实现ABC时会调用ABC哪个父类接口的方法呢

public classEimplementsA,B,C{@Overridepublic voidhello() {C.super.hello();}public static voidmain(String[] args) {newE().hello();}}

4、E同时实现ABC且继承自D时会调用ABCD哪个父类接口的方法呢

public classEextendsDimplementsA,B,C{public static voidmain(String[] args) {newE().hello();}}

其实这就是Java中设计的继承原则分别如下

1、第一个问题遵循子类优先原则:当接口之间有继承关系时,子接口的优先级最高

2、第二个问题遵循类优先原则:继承自类的方法优先级最高(E实现D的方法)

3、第三个问题遵循指定关系原则:当接口之间无继承关系时,编译器会强制指定方法的具体实现(例如接口B和接口C无继承关系那么此时需要在B和C之间选一个)

4、第四个问题可参照第二个问题的原则解释类优先原则

Java里面的多重继承也就这么点东西了

举报/反馈

声明:本文部分素材转载自互联网,如有侵权立即删除 。

© 版权声明
THE END
喜欢就支持一下吧
点赞0赞赏 分享
相关推荐
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容