好的,所以在axtavt和其他受访者的帮助下,我想出了什么问题.其他答案有帮助,但他们没有得到正确的,这就是为什么我在回答我自己的问题.问题原来是“运行时包”的概念,在
Java Virtual Machine specification中定义如下:
5.3创建和加载
…
在运行时,类或接口不是由其名称决定,而是由一对确定:其完全限定名称及其定义的类加载器.每个这样的类或接口属于单个运行时包.类或接口的运行时包由包名称定义并定义类或接口的类加载器.
…
5.4.4访问控制
…
当且仅当以下条件为真时,字段或方法R可以由类或接口D访问:…
> R被保护并且在C类中声明,D是C或C本身的子类.
> R是被保护的或者是私有的(即既不是public也不是private,也不是private),并且被同一运行时包中的类声明为D.
第一个条款解释道路是否允许访问Seed.garden,因为Road是Seed的子类,第二个条款解释了为什么Road 4号不允许访问它,尽管与Road相同,因为它不是在同一运行时程序包中,已被不同的类加载器加载.该限制实际上不是Java语言限制,它是Java VM限制.
所以对于我的情况的结论是,由于Java VM的合法限制,异常发生,我将不得不解决这个问题,可能通过将这些字段公开,这在这种情况下不是问题,因为它们是最终的,而不是秘密的,或者可能通过可以访问的道路将Seed.garden出口到4路.
谢谢大家的建议和答案!