关于JAVa中的导包相关的细节问题

先给大家看一个截图:

img


代码中用import关键字导入了三个不同jar包下的类,共同点是这三个jar包下的第一个文件夹是com,那么问题来了,如果在import的时候不声明是哪个jar包中的com包,在编译或者是运行的时候,JVM是怎么来进行确认的呢?
目前我有一个猜想:假如说JVM想找com.mysql.*这个目录,则会对所有已导入的jar包一一检索,直到找到含有com.mysql文件夹的jar包,然后再把这里面的类全部加载到内存中.但是万一有另外一个jar包中也含有com.mysql包呢?所以该猜想可能不成立.
所以还请指点一二

1.你这个只是第一级目录相同,下级目录并不一样,所以算不上同目录。我们导入的 包都是1.2.3.4.5,所以导入的都是明确的最后一个跟前面没有太大关系,只是一个路径而已
2.路径不会相同,即便相同也有文件名不同,文件名相同的情况就按照类的装载顺序覆盖
3.至于你说的寻找,那个就是你导入多少我拿多少,当然用于不用是另一回事,所以占空间而已,跟寻找没啥关系吧。当然也影响编译速度,虽然几乎没有,jar大小也没影响
4.寻找也是用哪个找那个,毕竟路径不是光给你看的,路径的意义除了明确结构,组织以外,还有面向对象的思想。同时也避免说我有两个a.java分别在不同包下,java不知道用哪个的情况
5.项目中的路径不是你想的那样,说不同包不是代表一个文件夹下多个同名文件夹,他就像你的电脑目录一样,同名只会有一个。你建立的那些同名最终还是会变成一个目录
6.运行的时候不是你想的那样全拿进来,实际上编译是一个很复杂的事情,这里面事情很多的,你要是有兴趣可以去看看
7.至于他怎么找到目标类加载这个我猜是类似于二分法的找法,另外没必要纠结这点小东西,他们的影响几乎没有
8。不管怎么导报,他都是用哪个加载哪个,不用的不加载

包是全限定名,如果包冲突,会报错的,带号是全部的,所以一般我们会设置不让用号,如果不设置,打包的时候就会打包一些不必要的包,你的这些猜想设计者肯定是考虑到的

1、对于这个问题,你看了java字节码是怎么加载的后,你就会明白了。
2、其实java在运行之前就对需要的类加载到内存了,如果你不声明类的来源,那编译都通不过。根本不可能运行。
3、相同类的权限定类名是不会存在第二个的

你说的这个应该是在编译的时候考虑的问题,你现在看到的是idea这个上面显示出来的。那么我来猜想一下。class里面的import不是需要的时候才导入的?是提前已经导入好了的?通过命令将程序编译打包、运行程序。这个时候在我们看不见的地方可能就已经有我们写的这个类模板时刻准备着的。