请教各位一个有关包的傻的可爱的问题,马上给分!!!

ervinlj 2003-02-28 04:43:50
各位网友大家好:
我做了一个有关包的程序,程序在以后列出。为什么在Package.java文件中import的时候,每次都要完全给出包名和类名呢?用import jlj.mypackage.*;为什么不可以呢?我把包文件都用javac -d . 编译在本地目录下。很怪呀!想破脑袋都百思不得其解啊!!!请各位看一下这个奇怪问题!非常感谢了!
MyPackage.java文件:
package jlj.mypackage;
public class MyPackage
{
public int j=4;
public MyPackage()
{
}
}
JljPackage.java文件:
package jlj.mypackage;
public class JljPackage
{
public int i=3;
public JljPackage()
{

}
}
Package.java文件:
import jlj.mypackage.JljPackage;
import jlj.mypackage.MyPackage;
//import jlj.mypackage.*;
public class Package
{
public static void main(String[] args)
{
JljPackage pObj=new JljPackage();
System.out.println(pObj.i);
MyPackage mObj=new MyPackage();
System.out.println(mObj.j);
}
}
...全文
763 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
jakkye 2003-03-03
  • 打赏
  • 举报
回复
你的问题真的很难懂,不过我还是实现了,这样的是,比如你的classpath里有一个是:
c:\jdk\bin
把你的包连同你的类一起放在这个classpath,就是你编译好的MyPackage.class和JljPackage.class放在
c:\jdk\bin\jlj\mypackage下面

你的Package里写的是import jlj.mypackage.*;
只要编译的时候这样写
javac -classpath c:\jdk\bin MyPackage.java
这样编译就能通过了。

呵呵,不知道是为什么,不写-classpath选项就不行,有4个错误,写了就可以了,可能这也是为什么javac也有-classpath这么一个选项的原因吧。
jakkye 2003-03-03
  • 打赏
  • 举报
回复
不好意思,上面的意见收回,没看明白问题。
jakkye 2003-03-03
  • 打赏
  • 举报
回复
哈哈,import *当然不可以了,你自己在写的这个类也是这个包里的一个,这个类还没编译出来,怎么引用进来呀。import一个具体的类当然可以了,因为那些个类都是写好编译好了的。

虽然import *的结果只是引入你要用到的类,不是引入所有的类,但是总得让它找到所有的类吧,正在写的这个就找不到,因为它是这个包里的一个类,但没有与之想应的.class文件对应。不知道我说的有没有道理。
ervinlj 2003-03-03
  • 打赏
  • 举报
回复
哇,高人这么多,要我怎么给分呢?如果我没有给分的高人,可不是说明你们的回答没有用哦!还是先谢过各位了!!!
tangshancheng 2003-03-03
  • 打赏
  • 举报
回复
对不起,写反了。

10、原则
a、服务类在包指定的目录内;
b、根包客户类的源代码和服务类的源代码在不同的目录中;
或者使用完整import语句(不使用import pacage.×;而使用import pacage.classname;)
c、有包客户类的源代码和服务类的源代码可以在同一目录中;

tangshancheng 2003-03-03
  • 打赏
  • 举报
回复
这个问题我以前也碰到过,今天整理出来。

//关于package的用法

假定:
1、JDK的环境变量:
JAVA_HOME=F:\j2sdk1.4.0_02
Path=E:\WINNT\system32;E:\WINNT;E:\WINNT\System32\Wbem;f:\j2sdk1.4.0_02\bin;
CLASSPATH=.; F:\java;F:\j2sdk1.4.0_02\lib;
2、目录:
F:\java

3、源文件:
F:\java\Vector.java
F:\java\List.java

F:\java\LibTest.java

4、文件内容
-------------------------
//: List.java
// Creating a package
package com.bruceeckel.util;

public class List {
public List() {
System.out.println(
"com.bruceeckel.util.List");
}
} ///:~
-------------------------
//: Vector.java
// Creating a package
package com.bruceeckel.util;

public class Vector {
public Vector() {
System.out.println(
"com.bruceeckel.util.Vector");
}
} ///:~
-------------------------
//: LibTest.java
// Uses the library
package c03;
import com.bruceeckel.util.*;

public class LibTest {
public static void main(String[] args) {
Vector v = new Vector();
List l = new List();
}
} ///:~
-------------------------

5、使用
F:\java>javac Vector.java -d .
F:\java>javac List.java -d .
F:\java>javac LibTest.java -d .

6、生成的目录及类
F:\java\com\bruceeckel\util\Vector.class
F:\java\com\bruceeckel\util\List.class
F:\java\c03\LibTest.class

7、执行
F:\java>java c03.LibTest

8、输出结果
com.bruceeckel.util.Vector
com.bruceeckel.util.List

9、注意
A、在客户类属于某个包时,如LibTest.java属于包c03:
a、使用package要保证成功的话,源文件都有放在统一的一个目录中,该目录
可以是任意目录(因为CLASSPATH中有".;",即当前目录也是类的搜索目录),
或者特别是CLASSPATH中指定的"F:\java";
b、编译时指定生成类.class的目标目录,
即"javac Vector.java -d ."或者"javac Vector.java -d f:\java"之类;
c、执行时要使用包名.类名,即"java c03.LibTest"

-----------------------------------

B、在客户类不明确属于某个包时,如LibTest.java中无语句"package c03;":
a、执行情况如下:
F:\java>javac LibTest.java -verbose
[parsing started LibTest.java]
[parsing completed 120ms]
[loading f:\j2sdk1.4.0_02\jre\lib\rt.jar(java/lang/Object.class)]
[loading f:\j2sdk1.4.0_02\jre\lib\rt.jar(java/lang/String.class)]
[checking LibTest]
[loading .\Vector.java]
[parsing started .\Vector.java]
[parsing completed 20ms]
LibTest.java:8: cannot resolve symbol
symbol : constructor Vector ()
location: class Vector
Vector v = new Vector();
^
[loading .\List.java]
[parsing started .\List.java]
[parsing completed 0ms]
LibTest.java:9: cannot resolve symbol
symbol : constructor List ()
location: class List
List l = new List();
^
[checking com.bruceeckel.util.Vector]
[loading f:\j2sdk1.4.0_02\jre\lib\rt.jar(java/lang/System.class)]
[loading f:\j2sdk1.4.0_02\jre\lib\rt.jar(java/io/PrintStream.class)]
[loading f:\j2sdk1.4.0_02\jre\lib\rt.jar(java/io/FilterOutputStream.class)]
[loading f:\j2sdk1.4.0_02\jre\lib\rt.jar(java/io/OutputStream.class)]
[checking com.bruceeckel.util.List]
[total 621ms]
2 errors

b、出错的原因在于编译器的原理:根据"CLASSPATH=.;f:\java;f:\j2sdk1.4.0_02\lib;"
查找当前目录、f:\java、f:\j2sdk1.4.0_02\lib等目录,来寻找所要类,但如果也找了
源文件.java,则编译之。
故由于LibTest.java没有明确属于某个包,则默认成属于根包,故查找到了Vector.java
和List.java,则编译之,这样就出错了:系统找到了新的类
(但不属于import中所指的包com.bruceeckel.util)。虽然后面也根据
"\com\bruceeckel\util"找到了引用的类,但是前面出错了,故停止了。

c、解决方法:
将"F:\java\Vector.java"、"F:\java\List.java"更改名字或移出LibTest.java
所在的目录;
或者使用完整的import语句即:
import com.bruceeckel.util.Vector;
import com.bruceeckel.util.List;

d、执行结果:
F:\java>javac LibTest.java -verbose
[parsing started LibTest.java]
[parsing completed 110ms]
[loading f:\j2sdk1.4.0_02\jre\lib\rt.jar(java/lang/Object.class)]
[loading f:\j2sdk1.4.0_02\jre\lib\rt.jar(java/lang/String.class)]
[checking LibTest]
[loading .\com\bruceeckel\util\Vector.class]
[loading .\com\bruceeckel\util\List.class]
[wrote LibTest.class]
[total 631ms]

F:\java>java LibTest
com.bruceeckel.util.Vector
com.bruceeckel.util.List

------------------------------------------------------------------

10、原则
a、服务类在包指定的目录内;
b、根包客户类的源代码和服务类的源代码在不同的目录中;
c、有包客户类的源代码和服务类的源代码可以在同一目录中;
或者使用完整import语句(不使用import pacage.×;而使用import pacage.classname;)
pcdiy 2003-03-03
  • 打赏
  • 举报
回复
我测试过了,完全没问题。你在检查一下。
ervinlj 2003-03-02
  • 打赏
  • 举报
回复
我的程序好象应该是没有什么问题的对把!那各位高人看,如果想要实现我以上说的功能,应该怎样来做才好呢???Sun对包的这种做法是不是没有处理的很好呢?谢谢各位了!
iceshape1 2003-03-02
  • 打赏
  • 举报
回复
你的问题的确很郁闷
我想不应该是程序的问题
你的程序没问题
ervinlj 2003-03-02
  • 打赏
  • 举报
回复
各位说的好象都没有道理啊!如果是各位,有两个Java源文件是属于同一个包的,将这两个同一个包的Java源文件编译到无论是当前目录或是其他CLASSPATH能找到的目录,然后在另个有main方法的Java源文件中用import包名.*应该怎样来做呢?这个问题没有搞懂,真郁闷啊!!!请举个实例,写上最简单的代码好吗?谢谢了!

!!
ervinlj 2003-03-02
  • 打赏
  • 举报
回复
尽管你们说自己不能import自己,但是如果是用具体的类名来import的话,是可以的。但为什么用通配符就不可以呢?你们这种说法好象不成立的啊!还是没有能搞明白啊!
还有如果将包文件打包到其他CLASSPATH能找到的目录,也是不行的呀!主程序文件与包文件明明不是同一个包的呀!!!奇怪啊!!!
贪梦 2003-03-01
  • 打赏
  • 举报
回复
同意skather(美女)的观点:自己不能import自己。
shine333 2003-03-01
  • 打赏
  • 举报
回复
同一个包不需要import
ervinlj 2003-03-01
  • 打赏
  • 举报
回复
各位能不能举个实例呢?两个Java文件是同一个包的,在主程序文件中用import 包名.*;将包导入进来,使主程序文件能访问这两个Java文件的类,看看你们是怎么写的?马上给分,决不食言!!!
ervinlj 2003-03-01
  • 打赏
  • 举报
回复
我没有自己import自己呀!各位注意看我的import语句上有package语句吗?没有是吗!那怎么会产生这个现象呢?怪啊!
zhangsanja 2003-02-28
  • 打赏
  • 举报
回复
鉴于你的第二个类没有写出具体的包:
对于一个包下的类是不需要import 的, 对于不同包下的类必须能够在CLASSPATH中找到,包括当前目录下的类(.)。
zhangsanja 2003-02-28
  • 打赏
  • 举报
回复
鉴于你的第二个类没有写出具体的包:
对于一个包下的类是不需要import 的, 对于不同包下的类必须能够在CLASSPATH中找到,包括当前目录下的类(.)。
skather 2003-02-28
  • 打赏
  • 举报
回复
自己不能import自己。
teddy_huang 2003-02-28
  • 打赏
  • 举报
回复
你是放在jlj\mypackage目录下吗?
ervinlj 2003-02-28
  • 打赏
  • 举报
回复
没有人能拿这20分吗?我急啊!

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧