场景:
两个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中的类并创建对象时,难道不是把所有方法都准备好了吗?为什么还会有父类方法不可见的情况
虚拟机类加载器在加载的时候有类的主动引用(一定会发生类的初始化)和被动引用(不会发生类的初始化)的区别
如果你没有导入父类的jar包,类加载器将无法加载这个父类,当然也无妨将其初始化
因为你没有引用A.jar,你用到的都要引入进来,包括父类
这是我依靠自己的聪明才智给出的答案。
程序中引用到的父类或者最原始的库都要加载进来的
程序中引用到的父类或者最原始的库都要加载进来的
父类没有加载,子类如何使用。子类的来源是父类的类型
可能我理解不清楚,或者你描述的不清楚。你说的引入是放到类库,还是import导入?
第一:如果是 没有引入到类库,那就没什么可说的了,子类继承了父类,父类没引入到类库,那子类继承谁呢。。。。。。。
第二:如果是没有import,没有import父类的时候应该没有问题的,我也针对这种情况做了实验,确实没问题。子类在初始化的时候会把父类初始化了。父类的除了私有成员外子类都是可以看到的。
楼上有人说主动引用和被动引用的事情,跟这个问题没多大关系。
如果可以,重构b.jar吧,取消b对a的强依赖,比如将b继承a改为b依赖a。否则a.jar必须引入。
jar包只是字节码,要经JVM转换成机器码才能执行。没有a.jar语法检查这一关都过不了。