范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

JAVA冷知识JAVA居然支持多继承吗?让我们用内部类去实现吧

  写在前面JAVA冷知识 ,今天和小伙伴分享的是通过内部类的方式实现 JAVA的多继承 一个 Demo 和JDK源码 中的具体场景部分内容参考  《编写高质量代码(改善Java程序的151个建议)》《Effective Java》中文版第3版 博文理解有误的地方小伙伴留言私信一起讨论
  与亲近之人不要说气话,不要说反话,不要不说话。——烽火戏诸侯 《剑来》
  众多周知,对于面向对象语言来讲,JAVA是不支持多继承的,只支持单继承,但是提供了接口来补偿。
  在实际的项目中,接口更多的用于行为的委托,把类本身一些是共性但又是特定的行为委托给一个接口的具体实现,当然接口也可以用于属性的委托,对象结构型的设计模式大都采用接口的方式来实现对对象内部组成的注册和操作
  如果实现java的多继承,其实很简单,关键是对于内部类的特征的掌握,内部类可以继承一个与外部类无关的类,保证了内部类天然独立性,根据这个特性从而实现一个类可以继承多个类的效果
  下面我们看一个Demo,声明父母两个接口,实现父母两个类,看如何通过内部类来继承父母类,而不是通过,接口委托的方式, 一个Demo
  父亲接口 package com.liruilong;  /**  * @Project_name: workspack  * @Package: com.liruilong  * @Description: 父亲接口  * @Author: 1224965096@qq.com  * @WeChat_Official_Accounts: 山河已无恙  * @blog: https://liruilong.blog.csdn.net/  * @Date: 2022/2/12  2:48  */ public interface Father {     /**      * @return: int      * @Description 强壮的行为      * @author LiRuilong      * @date  2022/2/12  2:49      **/      int strong(); }
  父亲实现类 package com.liruilong;  /**  * @Project_name: workspack  * @Package: com.liruilong  * @Description: 父亲类  * @Author: 1224965096@qq.com  * @WeChat_Official_Accounts: 山河已无恙  * @blog: https://liruilong.blog.csdn.net/  * @Date: 2022/2/12  2:51  */ public class FatherImpl implements Father {      static  public   String height = "身体超高";     /**     * @return: int     * @Description  强壮值     * @author LiRuilong     * @date  2022/2/12  2:51     **/     @Override     public int strong() {         return 8;     } }
  母亲接口 package com.liruilong;  /**  * @Project_name: workspack  * @Package: com.liruilong  * @Description: 母亲接口  * @Author: 1224965096@qq.com  * @WeChat_Official_Accounts: 山河已无恙  * @blog: https://liruilong.blog.csdn.net/  * @Date: 2022/2/12  2:50  */ public interface Mother {    /**     * @return: int     * @Description 温柔的行为     * @author LiRuilong     * @date  2022/2/12  2:50     **/    int Kind(); }
  母亲实现类 package com.liruilong;  /**  * @Project_name: workspack  * @Package: com.liruilong  * @Description: 母亲类  * @Author: 1224965096@qq.com  * @WeChat_Official_Accounts: 山河已无恙  * @blog: https://liruilong.blog.csdn.net/  * @Date: 2022/2/12  2:51  */ public class MotherImpl implements Mother{     static   public  String pretty = "脸蛋特别漂亮";    /**     * @return: int     * @Description 温柔值     * @author LiRuilong     * @date  2022/2/12  2:51     **/     @Override     public int Kind() {         return 8;     } }
  OK,准备工作做好了, 看我们如何实现。 package com.liruilong;  import java.util.logging.Logger;  /**  * @Project_name: workspack  * @Package: com.liruilong  * @Description: 孩子类  * @Author: 1224965096@qq.com  * @WeChat_Official_Accounts: 山河已无恙  * @blog: https://liruilong.blog.csdn.net/  * @Date: 2022/2/12  13:16  */ public class Son extends FatherImpl implements Mother {     static Logger logger = Logger.getAnonymousLogger();      MotherSpecial motherSpecial = new MotherSpecial();       @Override     public int strong() {         return super.strong() + 1;     }      @Override     public int Kind() {         return motherSpecial.Kind();     }       @Override     public String toString() {         return "Son{" +                 "height=" + height +"," +                 "pretty=" + MotherSpecial.pretty +                 "}";     }       public class MotherSpecial extends MotherImpl {         @Override         public int Kind() {             return super.Kind() - 1;         }     }      public static void main(String[] args) {         Son son = new Son();         logger.info(son.toString());         logger.info(son.strong()+"");         logger.info(son.Kind()+"");     }  }
  我们用内部类继承一个外部类无关的类,实现了 Son 类的多继承Bad level value for property: .level Bad level value for property: java.util.logging.ConsoleHandler.level Can""t set level for java.util.logging.ConsoleHandler 二月 12, 2022 2:02:06 下午 com.liruilong.Son main 信息: Son{height=身体超高,pretty=脸蛋特别漂亮} 二月 12, 2022 2:02:06 下午 com.liruilong.Son main 信息: 9 二月 12, 2022 2:02:06 下午 com.liruilong.Son main 信息: 7  Process finished with exit code 0
  这里只是讨论这样的写法,我个人认为,这种方法有些 鸡肋 。这种方式实现的多继承 ,完全可以通组合 的方式来实现,我们简单分析一下优缺点优缺点分析优点:
  通过内部类的方式,把继承关系控制在类的内部,理论上 比通过组合的方式更加安全 ,代码可读性要好一点。
  更符合设计原则中的 迪米特法则 ,又称最少知道原则(Demeter Principle),一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。缺点:
  首先通过继承的方式实现, 打破了类的封装性 ,子类依赖于其超类中特定功能的实现细节。 超类的实现有可能会随着发行版本的不同而有所变化,如果真的发生了变化,即使子类的代码完全没有改变,但是子类可能会遭到破坏因而,子类必须要跟着其超类的更新而演变,除非超类是专门为了扩展而设计的,并且具有很好的文挡说明 。
  其次,通过这样的方式实现的,不符合常态思想,尤其内部类同名的情况,容易被忽略某些特性(见JDK源码)。 JDK源码中的运用
  关于通过内部类来实现 java多继承 的JDK 场景,我们简单分析一下asListList integers = Arrays.asList(1, 2, 3);
  这个代码小伙伴们一定不陌生,这里通过 Arrays 工具类来生成一个List ,但是这里的List 并不是真正的ArrayList ,而是在Arrays工具类 内部定义的一个继承了AbstractList的静态内部类ArrayList ,这里java通过内部类的方式巧妙的实现了。  .......     @SafeVarargs     @SuppressWarnings("varargs")     public static  List asList(T... a) {         return new ArrayList<>(a);     }      /**      * @serial include      */     private static class ArrayList extends AbstractList         implements RandomAccess, java.io.Serializable     {         private static final long serialVersionUID = -2764017481108945198L;         private final E[] a;          ArrayList(E[] array) {             a = Objects.requireNonNull(array);         }     .................
  但是这里同样需要注意的是 通过内部类实现多继承要考虑其类的特殊性 :
  这样生成的 List 调用add 方法会抛不支持的操作的异常 ,基于Arrays 的ArrayList 是一个静态私有内部类,除了Arrays能访问以外,其他类都不能访问,正常的ArrayList中add方法是ArrayList父类提供,Arrays的内部类ArrayList没有覆写add方法。
  下面源码为 ArrayList静态内部类 实现的个方法。    /**      * @serial include      */     private static class ArrayList extends AbstractList         implements RandomAccess, java.io.Serializable     {         private static final long serialVersionUID = -2764017481108945198L;         private final E[] a;          ArrayList(E[] array) {             a = Objects.requireNonNull(array);         }          @Override         public int size() {             return a.length;         }          @Override         public Object[] toArray() {             return a.clone();         }          @Override         @SuppressWarnings("unchecked")         public  T[] toArray(T[] a) {             int size = size();             if (a.length < size)                 return Arrays.copyOf(this.a, size,                                      (Class<? extends T[]>) a.getClass());             System.arraycopy(this.a, 0, a, 0, size);             if (a.length > size)                 a[size] = null;             return a;         }          @Override         public E get(int index) {             return a[index];         }          @Override         public E set(int index, E element) {             E oldValue = a[index];             a[index] = element;             return oldValue;         }          @Override         public int indexOf(Object o) {             E[] a = this.a;             if (o == null) {                 for (int i = 0; i < a.length; i++)                     if (a[i] == null)                         return i;             } else {                 for (int i = 0; i < a.length; i++)                     if (o.equals(a[i]))                         return i;             }             return -1;         }          @Override         public boolean contains(Object o) {             return indexOf(o) != -1;         }          @Override         public Spliterator spliterator() {             return Spliterators.spliterator(a, Spliterator.ORDERED);         }          @Override         public void forEach(Consumer<? super E> action) {             Objects.requireNonNull(action);             for (E e : a) {                 action.accept(e);             }         }          @Override         public void replaceAll(UnaryOperator operator) {             Objects.requireNonNull(operator);             E[] a = this.a;             for (int i = 0; i < a.length; i++) {                 a[i] = operator.apply(a[i]);             }         }          @Override         public void sort(Comparator<? super E> c) {             Arrays.sort(a, c);         }     }
  即没有实现 add 和remove 方法,所以asList 返回的为一个长度不可变的列表 ,数组为多长转换为列表为多长,即不在保持列表动态变长的特性 。subList
  嗯,不多讲,直接上代码         ArrayList arrayList = new ArrayList();         LinkedList linkedList = new LinkedList();         Vector vector = new Vector();         linkedList.subList(2,3);         arrayList.subList(2,3);         vector.subList(2,3);
  List 提供一个subList 方法,与String 的subString 有点类似,这里的List 通过subList 生成子list 方式也是通过内部类继承方式的多继承 实现的。
  当然这里,具体需要分析, ArrayList 和其他List 的实现的方式略有不同
  ArrayList 是自己定义的内部类SubList 继承AbstractList 实现的public class ArrayList extends AbstractList         implements List, RandomAccess, Cloneable, java.io.Serializable {   .......     public List subList(int fromIndex, int toIndex) {         subListRangeCheck(fromIndex, toIndex, size);         return new SubList(this, 0, fromIndex, toIndex);     } .....     private class SubList extends AbstractList implements RandomAccess {         private final AbstractList parent;         private final int parentOffset;         private final int offset;         int size;     .........
  LinkedList 的subList 方法是由AbstractList 实现的,它会根据是不是随机存储 提供不同的实现方法 ,subList 返回的类也是AbstractList的子类SubList 。public abstract class AbstractList extends AbstractCollection implements List {   ........    public List subList(int fromIndex, int toIndex) {         return (this instanceof RandomAccess ?                 new RandomAccessSubList<>(this, fromIndex, toIndex) :                 new SubList<>(this, fromIndex, toIndex));     }    class SubList extends AbstractList {      ...     }    class RandomAccessSubList extends SubList implements RandomAccess{     .......     }     ........  }
  这里需要注意的是,不管是ArrayList还是LinkedList等其他List,通过SubList内部类生成的List,其所有的方法(get,add,set,remove等)都是在 原始列表上操作 的,它自身并没有生成一个数组或是链表 ,也就是子列表只是原列表的一个视图(View) ,所有的修改都反映在原列表 上。

为了全面屏而舍弃的呼吸灯,终于回归了,OPPO给了很不一样的设计在全面屏手机到来之前,很多的安卓手机都是带有一颗呼吸灯,能够有多种颜色提示不同的信息,不用点亮屏幕就知道是什么类型的提示消失,用过这个功能的到现在应该也不会陌生,也觉得这是一个很好WiFi6渗透率望快速提升一倍至5060产业链公司望受益据媒体报道,今年以来,WiFi6渗透率持续提升,需求端特别是在高端路由器PC当中,受远距离需求的带动,对高端连网设备需求有增无减。供应端则在上游芯片供应紧缺之下,更持续向高端产品迭带鱼屏显示器是鸡肋吗?都2021年了,是时候更新知识结构了都2021年了,还有人不喜欢带鱼屏?哎,众口难调,数码圈尤甚。说句实话,哥们我之前也属于看不上带鱼屏那一群,主要有3个原因。一是带鱼屏以宽取胜,但便宜的带鱼屏尺寸不大,因此其高度方为什么小米和红米明明是一家人,却要被分割成两个品牌?其实这个问题在红米独立的发布会(红米Note7系列发布会)上雷军就说得很清楚了,之所以把Redmi独立出来,就是为了差异化发展,不影响彼此。首先品牌定位不同熟悉小米发展史的都知道,2021年11月小米红米最值得购买的手机有哪些?新手购机指南(小白必看)对于目前的手机选择,一般就是流畅不卡顿手感好点手感好点拍照体验好点质感好点生态好点等下面放张图让你们更直观的去了解对于选择一部手机,每一个人的侧重点是不一样三星手机为什么没人买了?全球手机霸主真的这么差?正在用三星手机回答你这问题,三星手机全球销量第一第十一个年头你说说差吗?用三星回不去用国产,不管外观工设计防水屏幕显示都是顶级,正常用三星手机叫用不坏质量和苹果有一拼,和苹果手机各退押金还得拉好友,ofo的套路得管一管近日,多家媒体报道称ofo商城推出拉好友帮退押金功能,引发网友热议。有网友称,退押金是用户的权利,不应该有附加条件。也有网友认为,这种操作是坑完自己坑朋友。受到争议后,11月20日元宇宙下,NFT数字孪生技术梳理文章首发公众号钻石研报。来源招商证券。一NFT技术。NFT相较于FT具有不可替代性,使得NFT可以作为数字领域中真实性和所有权的证明。NFT(Nonfungibletoken)是基三大运营商该好好反思了!人民日报正式点名,5G发展背道而驰在全球通信技术领域,我国一直处于落后阶段,自从5G技术发展以来,我国终于开始崭露锋芒,想要摆脱国外对通信技术的垄断,我们必须加快5G网络的建设,摆脱通信技术落后的帽子。5G技术的高36氪首发脑机接口平台公司宁矩科技(NeuraMatrix)完成亿元人民币A轮融资,首颗系统级芯片年底将量产36氪获悉,国内唯一具备侵入式技术能力的脑机接口平台公司北京宁矩科技有限公司(NeuraMatrix)完成亿元人民币A轮融资,由华盖资本沙特阿美旗下多元化风投基金Prosperit电费每月好几百?清理完这9个电耗子,电器省钱很简单是不是有许多小伙伴很烦恼明明最近都没在家长待,但是电费却一直蹭蹭长呢,难道是有人偷电?其实偷电的并不是人,而是家里的各种电器在偷偷耗电一般家里常用的电器基本上有空调电视电脑热水器充
让家家户户买得起智能电视,拼多多联手JVC电视,65寸不到2000块最近,拼多多又有一条大新闻。就是拼多多的新品牌计划联合了兆驰,推出了极具性价比的JVC电视。这是兆驰和拼多多合作以来首次推出定制化智能大屏电视,其中像是65英寸4K智能大屏电视,仅蔚来智能互通网联建树警务效率,智慧巡车助力上海进博会蔚来是中国高端智能电动汽车的代表,开创了先进智能电动构架,打造智能数字座舱智能网关系统,以及领先的三电系统,体现了中国智造的高水准。上海公安与蔚来合作研发,共同进行智慧警务技术的试剁手党福音!天猫双11戴森吹风机日供3块6,网友真香了最近微信群里大家都在哭着喊着求抄购物车作业,只要是折扣力度大的,性价比高的,质量品牌靠谱的,通通照单全收!毕竟辛苦工作一年,趁着双11当然要买点好东西犒劳自己!不过经过几天的蹲守,Mobileye将向蔚来批量采购特别版本车型双方达成战略合作蔚来与全球领先自动驾驶技术公司Mobileye达成战略合作,共同打造L4级别自动驾驶车型,在全球范围内推动智能交通服务的变革Mobileye负责提供领先的MobileyeEyeQ系杭州8201线路夜班车变移动书展,温暖夜归人回家路许多生活大都市的人们,在努力奋斗的同时,也隐藏着对生活和工作各种各样的焦虑努力工作就能在大城市买房吗?加班加到绝望,我到底要不要裸辞?过了30岁还单身怎么办。。为了治愈这群焦虑的人三星抢发Exynos980跟麒麟990相比到底谁更强?9月4日,三星电子发布了旗下首款集成5G的芯片Exynos980。这款芯片采用8nm工艺制程,将5G通信调制解调器与高性能移动AP(ApplicationProcessor)合二为腾讯携手宝龙打造数字商圈,助力商业地产智慧升级11月1日,腾讯位置服务与宝龙商业集团在上海举行新闻发布会,双方达成战略合作协议,腾讯位置服务将利用自己在位置大数据方面的优势能力,为宝龙商业提供最全面的大数据支持,从项目选址筹建百度尹世明百度智能云助推AI工业化进程智能革命再加速8月29日,ABCSUMMIT2019百度云智峰会在北京国家会议中心举行。此次大会以AI工业化,加速产业智能为主题。百度副总裁智能云事业群组总经理尹世明表示,第四次工业革命正在中国发掘非物质文化遗产还能精准扶贫?首届非遗文创节闪耀丹寨东经1074410808北纬26052626之间,这里是黔贵小城丹寨。这里是以苗族为主的多民族聚居地,这里的自然风光让游客心驰神往,这里的苗族蜡染古法造纸等七个项目被国务院列为国家iPhone11为啥卖的这么好?库克创新了价格iPhone11系列发布之后,被媒体例行的唱衰,没有5G没有创新,浴霸摄像头等都成为吐槽的关键词。苹果分析师郭明祺此前也表示,因创新力不足,预计苹果三款新智能手机的出货量将下滑5至为什么中国企业做不出Costco如此火爆的场面呢?这种疯狂抢购的场面我们可能很多年没有见过了,8月27日Costco上海首家门店开业,不仅现场的茅台酒和名牌包被一抢而光,就连猪肉都被大妈们疯抢。因为上午的人流量突破了2万人,商场不