对Java 中双亲委派模型和重载,重写,继承的理解 古城微笑少年丶 2022-10-22 02:54 142阅读 0赞 ### 对Java 中双亲委派模型和重载,重写,继承的理解 ### * * 1.1 前言 * * 1.1.1 知识点 * * 1.1.1.1 双亲委派模型 * * 类加载器结构 * 何为双亲委派模型? * 什么时候需要自定义类加载器? * 1.1.1.2 重写 * 1.1.1.3 重载 * 1.1.1.4 继承 * 1.1.2 Java 中对重载,重写,继承的理解示例 ## 1.1 前言 ## 这篇博文来分享下博主对Java 中对双亲委派模型和重载,重写,继承的理解。 ### 1.1.1 知识点 ### #### 1.1.1.1 双亲委派模型 #### 在Java中,万事万物皆为对象,不同的对象就是不同的类。 > 众所周知,一个`*.java` 文件要经过javac编译器编译成`*.class` ,然后经过类加载器将`*.class` 加载到`JVM`虚拟机中的不同内存区域,等待CPU 调用执行。 不知你们有没有好奇类加载起是如何定位到具体到类并读取的呢? ##### 类加载器结构 ##### 要了解这个问题的答案,我们就需要了解类加载器的结构。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hhZHVlcw_size_16_color_FFFFFF_t_70] 类加载器类似于原始部落结构,存在权利等级制度。 > * 最高一层是家族中威望最高的BootStrap ClassLoader,它是在JVM启动时创建的,通常由与操作系统相关的本地代码实现,是最根基的类加载器。负责装载最核心的Java类,加载位于jre/lib/\*.jar的字节码,最先被加载,比如`Object`,`Sytem`,`String`等 > * 第二层是在JDK9版本中,成为Platform ClassLoader, 即平台类加载器,用以加载一些扩展的系统类,比如XML,加密,压缩相关的功能类等。JDK9 之前是Extendsion 类加载器,加载位于jre/lib/etc/\*.jar的字节码,第二被加载 > * 第三层是Application ClassLoader 是我们自己应用程序的类加载器,用以加载用户自定义的CLASSPATH 路径下的类。 **值得注意的是,类加载器具有等级制度,但是并非继承关系,以组合的方式来复用父加载器的功能。** ##### 何为双亲委派模型? ##### ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hhZHVlcw_size_16_color_FFFFFF_t_70 1] > 低层次的当前类加载器,不能覆盖更高层次类加载器已加载的类。如果低层次的类加载器想加载一个未知类,要非常礼貌地向上级逐级询问:“请问,这个类已经加载了么?” > 被询问的高层次类加载器会自问两个问题: > > * 第一:我是否已加载过此类? > * 第二:如果没有,我是否可以加载此类? > > 只有当所有高层次类加载器在两个问题上的答案均为否 时,才可以当当前类加载这个未知类。 > 如上图所示,左侧绿色箭头向上逐级询问是否已加载此类,直致BootStrap ClassLoader,然后向下逐级询问是否可以加载此类,如果都加载不了,则通知发起加载请求的当前类加载器,准予加载。 ##### 什么时候需要自定义类加载器? ##### > * 隔离加载类 > > 在某些框架内进行中间件与应用的模块隔离,把类加载到不同的环境。比如,阿里内某容器框架通过自定义类加载器确保应用中依赖的jar包不会影响到中间件运行时使用的jar包。 > > * 修改类加载方式 > > 类的加载模型并非强制,除BootStrap之外,其他的类加载器并非一定要引入,或者根据实际情况在某个时间点进行按需进行动态加载。 > > * 扩展加载源 > 比如从数据库,网络,甚至是电视机顶盒进行加载。 > * 防止源码泄漏 > Java代码容易被编译和篡改,可以进行编译加密,那么类加载器也需要自定义,还原加密的字节码。 #### 1.1.1.2 重写 #### 同时需要注意的是,当子类的方法和父类的方法名称,参数,返回值等都一样的时候,触发方法重写, > 即子类的方法会覆盖重写了父类的方法。 class Father{ protected Boolean haveHouseInCity=true; public void haveGoods(String house){ System.out.println("在农村有房子"+house); } } class Son extends Father{ protected Boolean haveCarInCity=true; public void haveGoods(String house){ System.out.println("在市里有房子"+house); } } #### 1.1.1.3 重载 #### 当类的方法名称一样,但是参数列表不一样的时候触发重载 > 即:子类增加了一个和父类中方法同名,但是参数个数或类型不同的方法。 class Father{ protected Boolean haveHouseInCity=true; public void haveGoods(String house){ System.out.println("在市里有房子"+house); } } class Son extends Father{ protected Boolean haveCarInCity=true; public void haveGoods(String car,String house){ System.out.println("在市里有房子"+house+"也有车"+car); } } #### 1.1.1.4 继承 #### 在java中,不同的对象用类表示,类与类之间存在继承关系,即如果子类中没有的方法,可以从父类中继承。 如下示例中,Son对象在市里没有房子,但是它的父类有,那么输出结果 Son 在市里也有房子。 /** * @author qing-feng.zhao */ public class Test { public static void main(String[] args) { Son son=new Son(); System.out.println("son有没有房子?"+(son.haveHouseInCity==true?"有":"没有")); } static class Father{ protected Boolean haveHouseInCity=true; } static class Son extends Father{ protected Boolean haveCarInCity=true; } } 输出结果: son在市里有没有房子?有 > 值得注意的是,子类可以通过继承拥有父类public 或protected 的属性和方法,但父类没有办法拥有子类的属性或方法。 > 在这个例子中就是: Son可以拥有Father在市里的房子,但是Father对象无法调用Son 的在市里的车。 ### 1.1.2 Java 中对重载,重写,继承的理解示例 ### Java 中对重载,重写,继承的理解示例如下: 当子类调用开轿车方法的时候: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hhZHVlcw_size_16_color_FFFFFF_t_70 2] 当父类调用开轿车方法的时候: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hhZHVlcw_size_16_color_FFFFFF_t_70 3] 本篇完~ [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hhZHVlcw_size_16_color_FFFFFF_t_70]: /images/20221022/e296442487724a148035b415d7575bb3.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hhZHVlcw_size_16_color_FFFFFF_t_70 1]: /images/20221022/a7d153ad89714f6185d7f24a3af83686.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hhZHVlcw_size_16_color_FFFFFF_t_70 2]: /images/20221022/2a4d3b67315741f8a245cfecf339520c.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hhZHVlcw_size_16_color_FFFFFF_t_70 3]: /images/20221022/8a9e73ceb2474b0d9c6561885ad6971b.png
相关 双亲委派模型 双亲委派模型(图解) ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9 冷不防/ 2022年11月10日 10:43/ 0 赞/ 199 阅读
相关 java双亲委派模型 参考文章:[java双亲委派模型][java] [Java类加载器(ClassLoader)][Java_ClassLoader] 双亲委派模式要求除了顶层的启动类加载器 深碍√TFBOYSˉ_/ 2022年11月07日 04:23/ 0 赞/ 164 阅读
相关 对Java 中双亲委派模型和重载,重写,继承的理解 对Java 中双亲委派模型和重载,重写,继承的理解 1.1 前言 1.1.1 知识点 1.1.1.1 双亲委派 古城微笑少年丶/ 2022年10月22日 02:54/ 0 赞/ 143 阅读
相关 双亲委派模型 一 定义与本质 类加载器用来把类加载到 Java 虚拟机中。从 JDK1.2 版本开始,类的加载过程采用双亲委派机制,这种机制能更好地保证 Java 平台的安全。 1 左手的ㄟ右手/ 2022年09月06日 14:19/ 0 赞/ 219 阅读
相关 双亲委派模型 说道双亲委派模型,就要从类加载器说起。。。。。。。。。。。 [Java][]虚拟机类加载过程是把Class类文件加载到内存,并对Class文件中的数据进行校验、转换解析和初始 亦凉/ 2022年07月12日 13:26/ 0 赞/ 232 阅读
相关 双亲委派模型 其实,双亲委派模型并不复杂。自定义类加载器也不难!随便从网上搜一下就能搜出一大把结果,然后`copy`一下就能用。但是,如果每次想自定义类加载器就必须搜一遍别人的文章,然后复制 落日映苍穹つ/ 2022年05月09日 16:56/ 0 赞/ 256 阅读
相关 双亲委派模型 双亲委派模型 类与类加载器 双亲委派模型 虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到 野性酷女/ 2022年03月10日 14:28/ 0 赞/ 271 阅读
相关 双亲委派模型 双亲委派模型 双亲委派模型简介 双亲委派模型实现源码分析 双亲委派模型的好处 双亲委派模型简介 每一个类都有一个对应它的类加载器。系统中的类加载 不念不忘少年蓝@/ 2021年11月10日 14:28/ 0 赞/ 633 阅读
相关 双亲委派模型 双亲委派模型(Since JDK.2): ![这里写图片描述][70] 从虚拟机的角度来看,类加载器主要分为启动类加载器(Bootstrap Classloader)和 £神魔★判官ぃ/ 2021年09月26日 14:36/ 0 赞/ 603 阅读
相关 双亲委派模型 围绕这四个问题去回答一下: 1. 什么是双亲委派模型 2. 为什么会有双亲委派模型 3. 可以打破双亲委派模型? 4. 为什么要打破双亲委派模型? 一、 ╰+攻爆jí腚メ/ 2021年09月25日 11:08/ 0 赞/ 383 阅读
还没有评论,来说两句吧...