hbzhdy
hbzhdy
2015-10-10 07:40
采纳率: 100%
浏览 3.0k
已采纳

Java JAR包中的类 父类方法不可见等

场景:
两个jar包分别为a.jar、b.jar。b.jar中引用了a.jar,具体为b.jar中的类B继承了a.jar中的类A。
A有两个方法,a.getName(),a.getAge(),B重写了getName方法,未重写getAge方法。
新建了一个Java项目C,**C只引用了b.jar,未引用a.jar**,于是出现了如下两个问题:
1、在C项目中,类B没有getAge方法
2、在C项目中,使用强制类型转换时(如)B b = (B)map.get("key"),会报错: - The type A cannot be resolved. It is indirectly referenced from required .class files
请教:1、构建子类对象时,继承自父类的方法为何没有加载?2、强制类型转换为何需要找A类?

追加:前提就是C项目不能引用a.jar。不然也不会发现这个问题。我知道引入a.jar可以解决这个问题。但是想知道为何必须引入a.jar。虚拟机加载b.jar中的类并创建对象时,难道不是把所有方法都准备好了吗?为什么还会有父类方法不可见的情况

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

8条回答 默认 最新

  • mo_fan_qing_wa
    modelfrog 2015-10-10 08:17
    已采纳

    虚拟机类加载器在加载的时候有类的主动引用(一定会发生类的初始化)和被动引用(不会发生类的初始化)的区别
    如果你没有导入父类的jar包,类加载器将无法加载这个父类,当然也无妨将其初始化

    点赞 评论
  • bdmh
    bdmh 2015-10-10 07:44

    因为你没有引用A.jar,你用到的都要引入进来,包括父类

    点赞 评论
  • qq_31742511
    qq_31742511 2015-10-10 07:46

    这是我依靠自己的聪明才智给出的答案。

    点赞 评论
  • yuanmengong886
    yuanmengong886 2015-10-10 08:02

    程序中引用到的父类或者最原始的库都要加载进来的

    点赞 评论
  • yuanmengong886
    yuanmengong886 2015-10-10 08:02

    程序中引用到的父类或者最原始的库都要加载进来的

    点赞 评论
  • linych
    Tarry-Lin 2015-10-10 09:54

    父类没有加载,子类如何使用。子类的来源是父类的类型

    点赞 评论
  • hello_lizishule
    hello_lizishule 2015-10-10 09:58

    可能我理解不清楚,或者你描述的不清楚。你说的引入是放到类库,还是import导入?
    第一:如果是 没有引入到类库,那就没什么可说的了,子类继承了父类,父类没引入到类库,那子类继承谁呢。。。。。。。
    第二:如果是没有import,没有import父类的时候应该没有问题的,我也针对这种情况做了实验,确实没问题。子类在初始化的时候会把父类初始化了。父类的除了私有成员外子类都是可以看到的。
    楼上有人说主动引用和被动引用的事情,跟这个问题没多大关系。

    点赞 评论
  • lic0112
    lic0112 2015-10-12 10:09

    如果可以,重构b.jar吧,取消b对a的强依赖,比如将b继承a改为b依赖a。否则a.jar必须引入。
    jar包只是字节码,要经JVM转换成机器码才能执行。没有a.jar语法检查这一关都过不了。

    点赞 评论

相关推荐