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个回答

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

hbzhdy
hbzhdy 父类的jar包包含在导入的jar包中,即b.jar中包含a.jar,这种形式下虚拟机找不到a.jar中的类?
接近 5 年之前 回复

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

hbzhdy
hbzhdy 回复snailplus: 谢谢回答!
接近 5 年之前 回复
snailplus
snailplus ps:不明白你所谓的初始化指什么哪个动作。
接近 5 年之前 回复
snailplus
snailplus ps:不明白你所谓的初始化指什么哪个动作。
接近 5 年之前 回复
snailplus
snailplus 回复hbzhdy: 你所谓的不可见,是在编辑器里看不到吧,那是编辑器功能,跟Java的类加载没关系。只要用到了子类,父类就必须引入。你可以认为类是在使用时加载。
接近 5 年之前 回复
hbzhdy
hbzhdy 不引入a.jar为什么会导致B类父类的方法不可见,难道方法加载不是在初始化B的对象时完成了吗
接近 5 年之前 回复

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

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

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

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

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

hbzhdy
hbzhdy 根据我的问题描述:在C项目中引入了b.jar,但没有引入a.jar。其中b.jar中包含a.jar。我只需要直接使用b.jar中的类。这种情况叫引入吗?
接近 5 年之前 回复

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐