多个包同名
如果有两个包,名字一样,但其物理位置不一样。在一个类中我引用这个包,我发现,两个包中的类都会可以被引用。也可以被JAVAC执行,但是在Resin中,我发现,同名的包不能被放在两个地方,不然就会出现NoClassFoundException,请问有谁遇到过这个现象,可以解释一下吗?谢谢。 问题点数:50、回复次数:17Top
1 楼zbc(修身养息,百战不怠)回复于 2002-09-14 21:40:39 得分 50
菜鸟到此一游,learning…………Top
2 楼Joeblackyang(暗夜精灵)回复于 2002-09-14 22:01:58 得分 0
可能是同名的类冲突了,java不允许classpath中有两个同名的类,这会导致NoClassFoundExceptionTop
3 楼chiliast(钓鱼太郎)回复于 2002-09-14 23:30:19 得分 0
楼上真解,Java都是通过Classpath来寻找包的,当然也不允许Classpath中存在相同的类Top
4 楼haode(好的)回复于 2002-09-15 07:24:32 得分 0
如果你这样:
import aaa.bbb.ccc;
import aaa.ddd.ccc;
那么在程序中,就不能出现类似
private ccc nn=new ccc();
而需要
private aaa.bbb.ccc nn ……
Top
5 楼haode(好的)回复于 2002-09-15 07:25:35 得分 0
不过如果你这样用
private aaa.bbb.ccc nn ……
那么一开始的时候就不用import aaa.bbb.ccc了Top
6 楼xiao_yuer(小鱼儿)回复于 2002-09-15 10:39:12 得分 0
可能是同名的类冲突了,java不允许classpath中有两个同名的类.
楼上真解,Java都是通过Classpath来寻找包的,当然也不允许Classpath中存在相同的类
Joeblackyang(做IT做得身心疲惫) 、 chiliast(钓鱼太郎) 请不要误导别人了。
唉,你了解java中使用classpath的机制么?classpath中设置的是类所在路径(目录)或者是类所在的jar包(其实也相当于是一个目录).所以你怎么在classpath中放具体的class?!
还有通过classpath,的确可能可以找到多个相同的类,但是java的加载机制是先加载放在classpath中较前位置的目录(或jar包)中的类,但也决不会产生什么冲突。
而且class的加载和import是完全无关的。import只是方便你在引用类时可以少些包名而已。Top
7 楼tomxutomxu(shprog)回复于 2002-09-15 19:59:34 得分 0
我又看了看,是这样子的。(可能我没有说清楚)
1、有两个不同物理位置的包,名字是一样的。其中类名一样也是可以的。是可以没有问题的使用的。(类会按CLASSPATH中先后顺序用前面的一个)
2、我上次提出的问题在于:别的包可以同名,但是java.io这个包不可以再来一个同名的。这是JVM的安全手段。否则会有:Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.io
3、我想建一个类替代系统的FILE类,发现FileSystem只能在本包中使用(protected),而且只能在java.io包中使用(safetylink),于是我想到再建一个IO包,没有想到IO包只能有一个。呵呵。Top
8 楼namowen(寒号不已)回复于 2002-09-15 20:06:33 得分 0
我觉得不管是不是由于java.io不可以同名,都没有必要建两个同名的包。另起一个名称,是不会有任何不妥的Top
9 楼tomxutomxu(shprog)回复于 2002-09-15 21:28:10 得分 0
namowen(寒号不已) ,
我使用别人的系统,当然使用他提供的java.io.File(系统设置我不能改),这个类被他重写了。而我不想使用他的这个被重写的java.io.File.于是我就想写一个File,放在我自己的目录下,我自己使用。写File类需要FileSystem,这是一个protected类,只能在自己包中使用,于是,我要把FileSystem也重写一下(COPY到我自己的目录下),可是,FileSysytem用了JNI(Native Interface),这里面决定它只能在名为java.io的包中被使用,于是我要把自己的目录(新建一个包)也命名为java.io。
问题就来了,java.io包只能有一个。
这就是问题的由来。Top
10 楼haode(好的)回复于 2002-09-15 22:16:03 得分 0
你不用他的那个java.io.File,是不是可以用自己写的那个把他的替换掉?
或者你不要把这个类叫FileTop
11 楼lanyunfeng(蓝色咖啡)回复于 2002-09-15 23:29:34 得分 0
出现这种情况时,你只能引用完整路径,就不会产生这种问题,想JAVA SDK中
java.util包中有一个Timer类,而javax.swing包中也有一个Timer类,当你在一个程序中同时导入这两个包时,你要使用其中一个Timer类建立对象就必须引用全路径建立对象,
如:javax.swing.Timer timers=new javax.swing.Timer();
才不会导致程序出错。Top
12 楼tomxutomxu(shprog)回复于 2002-09-16 09:10:20 得分 0
haode(好的) ,
不是这个类叫什么名字的问题,而是我如果要写File类的操作,就要用FileSystem中的Native Interface,面这个JNI只能在名为java.io包中被使用.
java.io包只能有一个。Top
13 楼tomxutomxu(shprog)回复于 2002-09-18 17:55:08 得分 0
!!!!!!!!!!!!Top
14 楼babyfu(你的亲亲宝贝)回复于 2002-09-18 17:59:48 得分 0
?????????????????????
Top
15 楼tomxutomxu(shprog)回复于 2002-10-10 11:34:06 得分 0
请高手研究研究。Top
16 楼tomxutomxu(shprog)回复于 2002-10-27 10:07:58 得分 0
翻出来看看。Top
17 楼fanqing(火影忍者+28%(准备学习进程/线程))回复于 2002-10-27 11:15:59 得分 0
引用具体的路径,即写全部的名称来用。
同意:haode(好的)Top




