晚上群里一位朋友问了个怪问题,如下:package test;
public class Cat extends Animal
{
    public String eyecolor;
    public Cat(String name,String eyecolor)
    {
        this.name=name;
        this.eyecolor=eyecolor;
    }
} 这个保存在Cat.java里。public class Animal
{
    public String name;
}这个保存在Animal.java里。然后另写一Test.java,在main方法里实例化一个Cat。
先编译了Animal,再编译Cat时编译不了,报的错是找不到Animal类。于是我想,在Cat类里加一句import Animal;应该可以吧,于是我就试了,结果编译时报错:
Cat.java:1: 需要 '.'
import Animal;
             ^我又试了import *;:
Cat.java:1: 需要 <标识符>
import *;
      ^于是我想:该怎么导入不带包的类呢?
上google搜索了一把,没有找到方法。
在QQ里和CrazyGou讨论了一下,再回想了一遍,好像曾经听哪位老师说过,写类的时候加上包名是好习惯。再仔细的想了想:
jdk里不同包中同名的类很多,比如DataOutputStream就有两个,一个是接口,一个是类。Date也有两个,java.util.Date和java.sql.Date。
当同时import java.util.*;和import java.sql.*;的时候,再声明一个Date date;,编译时报错:对 Date 的引用不明确,java.sql 中的 类 java.sql.Date 和 java.util中的 类 java.util.Date 都匹配。
这有解决的方法,就是把类的全名都写上:java.util.Date date;或者java.sql.Date date。
但如果自己写了一个不带包名的ArrayList类,另一个类同时要调用到这个不带包的ArrayList类和java.util.ArrayList类,该如何声明那个不带包的ArrayList类呢?ArrayList list;吗?因为这种情况没办法测试(没办法导入不带包的类),所以不知道结果如何,但根据前面那个试验可以猜测应该会产生一样的错误。最后结论:设计一个类的时候,都要加上包名。

解决方案 »

  1.   

    呵呵。不带包定义,就是缺省包,是不用import的。至于楼主说的编译不了,是你编译时所给的cp路径有问题而已。
      

  2.   

    和classpath没关系。我试过把类路径放到classpath里去。
      

  3.   

    嗯。试了一下,确实如此。看了java language specification,缺省包在规范里叫“无名包”,无名包并不能理解为在根目录下的未命名的包,无名包是和当前目录相关的,也就是说,每个目录自己隐含着有一个无名包。所以,按楼主例中的这两个类,确实是无法编译的。