包导入和访问,我们把它看成是一张图,可以帮我们理解“可见”与“不可见”的边界。第一个概念辨析:Import不等于Access,这两个词的含义差别挺大的。在支持包管理的编程语言里,Java、Python里面Import可以理解为把包A的内容直接拉入包B的命名空间里。这样一来,包B的成员就可以随意调用包A公开接口了。而Access更像是一把钥匙,你把包A的内容给拷贝到包B私有目录下,外部的人看不见,只有包B自己能使用。所以,Import就像一个公开通道,而Access则是隐蔽后门。 通过图表来看看两种机制的区别。2.1 示例(a):通过Import,层层可见的话就像阳光普照一样。比如包B Import 包C,接着包A Import 包B,结果就是包A可以直接看到包C的公开成员,无需任何中转操作。2.2 示例(b):而Access则是层层隐藏的,像抽屉里的文件夹一样。这次包B Access 包C后,接着是包A Import 包B,结果就是包A只看到了一个壳子,根本不知道还有个包C存在,更别提调用它的接口了。 很多人误以为Access会让目标完全消失,其实不是这样的。Access更像是把目标复制到本地并给这个目录打上隐藏属性。对外看起来是给上层调用者展示一个干净利落的接口;但对内部来说,原来目标依然存在,依然可以使用它的所有功能。 总结一下:记住三条铁律来理解可见性:Import是一条公开通道,下游可以顺藤摸瓜找到目标;Access是一条隐蔽隧道,下游只能看到隧道口而已;其实目标没有消失,只是被访问者看不到路径罢了。搞清楚这三点,再复杂的依赖关系都能一眼看穿。