某面经中有一段提到,双亲委派模型中三个类加载器的关系是否为继承?

我回想起书上的配图,感觉好像是这么一回事:

类加载器的双亲委派模型

但是文章作者接着说:肯定不是继承

疑惑。

于是我又回去翻了翻《深入理解 JVM》,发现配图下面还有一句话:

不过这里的类加载器之间的父子关系一般不是以继承的关系来实现的,而是通常使用组合关系来复用父加载器的代码。

看来,书看的还是不够仔细。

然后搜索了一下关于组合的具体含义

组合

组合就是 A 类是 B 类的成员变量。B 类可以通过调用 A 类对象来使用 A 类的所有功能。

组合实际上体现的是整体与部分的关系,即 has-a 关系。

class 电池{

  public void 放电(){
    System.out.println("输出电能");
  }

}

class 屏幕{
  
  public void 亮屏{
    System.out.println("显示内容");
  }

}

class CPU{

  public void 运算{
    System.out.println("浮点计算");
  }

}

//----------------------------------------

class 手机{
  
  private 电池 dc;
  private 屏幕 pm;
  private CPU cpu;

  手机(电池  dc,屏幕 pm,CPU cpu){
    this.dc = dc;
    this.pm = pm;
    this.cpu = cpu;
  }

  public 开机(){

    dc.放电();
    cpu.运算();
    pm.亮屏();
    
    System.out.println("开机成功");
  }
  
   public static void main(String[] args) {
       
      电池 dc = new 电池();
      屏幕 pm = new 屏幕();
      CPU cpu = new CPU();
    
     手机  sj = new 手机(dc,pm,cpu);
      sj.开机();

   }

}

继承

B 类继承 A 类的功能,并可以增加自己的功能。

继承体现的是父子关系,即 is-a 关系。

个人理解

组合就像是一个大框架里有许多小组件,每个小组件都是一个类

继承是父类具有子类抽象出来的共同特性,而子类又有自己的个性

参考资料:

https://www.jianshu.com/p/f32e99e64c1c