12
返回列表 发新帖
楼主: danazwd

问个关于package 的初级问题

[复制链接]
论坛徽章:
43
ITPUB元老
日期:2007-01-14 09:32:112011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:56管理团队成员
日期:2011-05-07 01:45:08开发板块每日发贴之星
日期:2011-08-29 01:01:012012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:18
11#
发表于 2007-2-11 12:19 | 只看该作者
不过上面的还不算太乱,如果同一目录中存在不同级别package的类就更有趣了。

import dir1.*;
import dir2.*;
import dir1.dir2.*;

public class Test{
       
        public static void main(String [] args){
                System.out.println(SomeClass.name);
                System.out.println(dir1.SomeClassDir1.name);
                System.out.println(dir2.SomeClassDir2.name);
                System.out.println(dir1.dir2.SomeClassDir2Level2.name);

        }
}

import dir1.SomeClassDir1;
import dir2.SomeClassDir2;
import dir1.dir2.SomeClassDir2Level2;

public class Test2{
       
        public static void main(String [] args){
                System.out.println(SomeClass.name);
                System.out.println(SomeClassDir1.name);
                System.out.println(SomeClassDir2.name);
                System.out.println(SomeClassDir2Level2.name);
        }
}


package dir1.dir2;
public class SomeClassDir2Level2{
        public static String name="SomeClassDir2Level2";
}


javac -cp .;dir1\;dir1\dir2\dir3 Test.java
javac -cp .;dir1\;dir1\dir2\dir3 Test2.java
java -cp .;dir1\;dir1\dir2\dir3 Test
java -cp .;dir1\;dir1\dir2\dir3 Test2
编译运行正常



不过在试的过程中,发现import的写法和写完整类名之间还有一定的关系。尤其是在同一目录下多个不同级别的包共存的情况下,import package.*的写法是行不通的。要么写全类名,要么import完整类名。

packageconflict.jpg (39.79 KB, 下载次数: 3)

packageconflict.jpg

使用道具 举报

回复
论坛徽章:
43
ITPUB元老
日期:2007-01-14 09:32:112011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:56管理团队成员
日期:2011-05-07 01:45:08开发板块每日发贴之星
日期:2011-08-29 01:01:012012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:18
12#
发表于 2007-2-11 13:02 | 只看该作者
继续,所以最后的得到的若干种可能就是

o.import 完整类名

o.直接使用完整类名,此时可以import *


o.如果存在同一目录下不同级别的包的情况,代码中不能写import*,否则报错。
Test.java:9: cannot access SomeClassDir1
bad class file: \topdir\dir1\SomeClassDir1.class
class file contains wrong class: dir1.SomeClassDir1
Please remove or make sure it appears in the correct subdirectory of the classpa
th.
                System.out.println(SomeClassDir1.name);
                                   ^
1 error

这是因为为了import dir2.*,使用dir1作为一个开始节点,而此时dir1下的class应该是toplevel,而someclassdir1不是,所以产生冲突。

可以不写import,代码中写全类名可以绕过这个问题
public class Test3{
       
        public static void main(String [] args){
                System.out.println(SomeClass.name);
                System.out.println(dir1.SomeClassDir1.name);
                System.out.println(dir2.SomeClassDir2.name);
                System.out.println(dir1.dir2.SomeClassDir2Level2.name);               
        }
}



编译
javac -cp \topdir;\topdir\dir1;\topdir\dir1\dir2\dir3 Test3.java
或者
javac -cp \topdir\dir1\dir2\dir3;\topdir;\topdir\dir1 Test3.java
或者
javac -cp \topdir\dir1;\topdir;\topdir\dir1\dir2\dir3 Test3.java
执行
java -cp \topdir;\topdir\dir1;\topdir\dir1\dir2\dir3 Test3
执行正常


另外给一个参考连接,讲得蛮详细的
http://mindprod.com/jgloss/classpath.html

使用道具 举报

回复
论坛徽章:
43
ITPUB元老
日期:2007-01-14 09:32:112011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:56管理团队成员
日期:2011-05-07 01:45:08开发板块每日发贴之星
日期:2011-08-29 01:01:012012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:18
13#
发表于 2007-2-11 13:10 | 只看该作者
另外就是如果存在多个同名的class,则哪个在前执行哪个。不过这属于一般知识了,呵呵
Drive:\TOPDIR
|  SomeClass.class
|  SomeClass.java
|  Test.class
|  Test.java
|  Test2.class
|  Test2.java
|  Test3.class
|  Test3.java
|
\---dir1
  | SomeClassDir1.class
  | SomeClassDir1.java
  |
  \---dir2
    | SomeClassDir2.class
    | SomeClassDir2.java
    | SomeClassDir2Level2.class
    | SomeClassDir2Level2.java
    |
    \---dir3
        SomeClass.class
        SomeClass.java

public class SomeClass{
        public static String name="SomeClassAtTopLevel";
}


Drive:\topdir>java -cp \topdir;\topdir\dir1;\topdir\dir1\dir2\dir3 Test3
SomeClassAtTopLevel
SomeClassDir1
SomeClassDir2
SomeClassDir2Level2

Drive:\topdir>java -cp \topdir\dir1;\topdir\dir1\dir2\dir3;. Test3
SomeClass
SomeClassDir1
SomeClassDir2
SomeClassDir2Level2

使用道具 举报

回复
论坛徽章:
131
乌索普
日期:2017-09-26 13:06:30马上加薪
日期:2014-11-22 01:34:242014年世界杯参赛球队: 尼日利亚
日期:2014-06-17 15:23:23马上有对象
日期:2014-05-11 19:35:172014年新春福章
日期:2014-04-04 16:16:58马上有对象
日期:2014-03-08 16:50:54马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14
14#
发表于 2007-2-11 13:19 | 只看该作者
你这不把人搞晕才怪

使用道具 举报

回复
论坛徽章:
43
ITPUB元老
日期:2007-01-14 09:32:112011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:56管理团队成员
日期:2011-05-07 01:45:08开发板块每日发贴之星
日期:2011-08-29 01:01:012012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:18
15#
发表于 2007-2-11 13:26 | 只看该作者
懂与不懂,清楚与不清楚,只有多反复几次,才理解得更深刻,呵呵

使用道具 举报

回复
论坛徽章:
9
ITPUB元老
日期:2009-11-25 15:11:25雪铁龙
日期:2013-11-18 09:03:16马上有车
日期:2014-04-26 17:04:01懒羊羊
日期:2015-05-07 16:00:27
16#
发表于 2007-2-18 21:24 | 只看该作者
呵呵

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表