我在E:\my\yuanqian下建立了C.java和D.java
但D编译不通过,我的问题是C和D都在同一个package下的啊,怎么D编译的时候提示说找不到符号C,
下面是C和D 的代码:
C.java:
package yuanqian;
public class C {
  public int a;
  private int b;
  protected int c;
  int d; // "Friendly"
  public void f1() {}
  private void f2() {}
  protected void f3() {}
  void f4() {} // "Friendly"
  public static void main(String args[]) {
    C test = new C();
    test.a = 1;
    test.b = 2;
    test.c = 3;
    test.d = 4;
    test.f1();
    test.f2();
    test.f3();
    test.f4();
  }
}
D.java:
package yuanqian;
public class D {
  public D() {
    C test = new C();
    test.a = 1;
    //! test.b = 2; // Can't access:  private
    test.c = 3;
    test.d = 4;
    test.f1();
    //! test.f2(); // Can't access:  private
    test.f3();
    test.f4();
  }

解决方案 »

  1.   

    D.java文件中要将C import进去
      

  2.   

    你是用JDK编译的吗?
    如果是,那你的classpaht是怎么设置的?
    如果你的classpath里有.;那你在CMD下当前目录是什么?在编译时,如果一个类调用另外一个类,那么编译器会先载入那个类,在你这种情况,编译器载入是没有问题的(如果你的classpath里有.;且那你在CMD下当前目录是E:\my\yuanqian);接头编译器会检验类的正确与否,即package yuanqian; 然而,它发现类C应该在E:\my\yuanqian\yuanqian下才对,于是会报错。
    解决办法,把二个类的package yuanqian全删除如果你的classpath里有.;且那你在CMD下当前目录是E:\my;那么你根本就不可能会编译D类,因为会找不到D类的。
      

  3.   

    补充一点,关于import和package,王森的《java深度历险》里有一章,讲的很不错。
    (具体是第几章,记不得了),可以去看看
      

  4.   

    我的classpath是.;
    当前目录是E:\my\yuanqian
    当我在E:\my\yuanqian 下javac D.java时抱错..
    但C和D都在同一个package下的啊..!
      

  5.   

    仔细看看我的第二段。
    编译器载入C类时,会检查,就是package yuanqian;这句,因为你的classpath是E:\my\yuanqian,所以它会认为C类应该在E:\my\yuanqian\yuanqian才对。而C类去不在这个路径,所以它就报错了!
      

  6.   

    我的classpath不是E:\my\yuanqian,我的classpath是.;
      

  7.   

    .就代表当前目录,
    如果你是用JDK的话,
    在CMD下,你的当前目录是E:\my\yuanqian
    所以二个就是一样的了啊
      

  8.   

    我改在E:\my下建了D.java,然后在E:\my下javac D.java通过,可是不知道怎么运行了??
      

  9.   

    你把C.java放在E:\my\yuanqian下,D.java放在E:\my下,编译能过了?不可能吧,除非你在D类中加入了
    import yuanqian.*;
    或者你的classpath里有E:\my\yuanqian这个
      

  10.   

    是的 啊
    我在E:\my\yuanqian下javac C.java通过
    在E:\my\下java D.java也通过了啊
      

  11.   

    应为javac编译的时候会根据classpath来寻找类文件,一般学习的时候会有好多杂乱的文件所以很少有人随时修改classpath到自己包的上级目录,这样javac在classpath和当前目录都找不到你的yuanqian.D类,有3个方法:
    1.在包的上级目录编译程序,如:切换到"e:\my"目录下运行"javac yuanqian\D.java"
    2.将你的包的上级目录加入到classpath里面,如:"set classpath=%classpath%;e:\my"
    3.指定classpath,如:"javac -cp e:\my D.java"BTW,JB里面包好长的路径啊....
      

  12.   

    实际上,要理解的是包就是目录,你把这个搞清楚就可以了
    比如"package yuanqian;"就是告诉java系统,我这个文件里面的所有类你都要到当前目录下的名字是:yuanqian的目录里面找。那么java编译的时候先读取java文件,然后会加载文件里面用到的所有类,包里面的类如果没有编译就会先编译这个文件,所以你在e:\my\yuanqian为当前目录的情况下可以编译通过C.java因为C.java里面用到的类是Java基本类,都可以找到,编译D.java的时候,他发现你用到C类但是却找不到C类(因为你的当前目录为:e:\my\yuanqian,当前目录下面并没有yuanqian这个包(目录))。
    当你将D.java复制到包(yuanqian)的上层目录的时候肯定可以编译通过的,因为你的当前目录现在是:e:\my,当前目录下有个目录(包)yuanqian ,而且yuanqian里面有C.java或者C.class,所以能编译通过,你要是不信你把e:\my\yuanqian目录里面的C.java,C.class删除掉你在编译,肯定不能通过.
    如果你的包都存放在e:\my目录下面建议你把e:\my加入classpath,这样你以后不论在那里都可以编译和运行程序了。
      

  13.   

    把e:\my加入classpath了,现在可以在e:\my\yuanqian下编译C.java和D.java了
    可是运行的时候不对了...
      

  14.   

    我在E:\my\yuanqian下建立了C.java和D.java
    但D编译不通过,我的问题是C和D都在同一个package下的啊,怎么D编译的时候提示说找不到符号C,
    下面是C和D 的代码:
    C.java:
    package yuanqian;……============================
    命令行进入E:\My目录,然后进行编译和执行:
    E:\My>javac yuanqian/C.java
    E:\My>javac yuanqian/D.java
    E:\My>java yuanqian.C带包情况下的命令行编译和执行都是像这样写的。和classpath没有任何关系,-_-
      

  15.   

    好象在一个包里面不能有两个public 类吧
    我看见C和D都是以public 作修饰符的啊小弟愚见,说错了不要笑
    呵呵
      

  16.   

    类C中f2这个方法是private私有的,外部无法访问,只能在改类中使用,要将访问级别改为public
      

  17.   

    引用hellox();
    把e:\my加入classpath了,现在可以在e:\my\yuanqian下编译C.java和D.java了
    可是运行的时候不对了...
    运行是要找.class文件。你的包是package yuanqian;所以应该把生成的.class放到那个目录下,即把C.class和D.class
    文件复制或剪切到E:\my\yuanqian。