加了package后javac编译就无法通过了
 
 
 
aa.java
 public class aa
 {
 String abc;
 }

 aaa.java
 public class aaa extends aa
 {
 public String getAbc()
 {
 return abc;
 }
 }
 如果直接这样编译是没有问题的,但是如果分别在两个java文件前加入
 package test;
 后,就会出现aa.java这个编译通过,但是aaa.java这个编译出错。
 请问这是什么原因。
 aa.java和aaa.java这两个文件都放在c:\test\目录下 
 
【masse】:
 在cmd下进入C盘,而不是C:\test

 C:\>javac test/aa.java

 C:\>javac test/aaa.java

 【masse】:
 到C盘下运行你的命令,不要到test目录下。

 【viviandou2】:
 可是我在test目录下面运行javac *.java的时候又可以通过这是怎么一回事啊?

 【stevenzxl】:
 不应该阿,公共类,又是同一个包,编译应该没问题啊,报错的信息是什么?

 【viviandou2】:
 用  masse(当午)  的办法编译是正确的,但是我就是不知道为什么在test目录下用javac *.java
 又是正确的。
 stevenzxl() 兄,我也是自学的java,所以也不明白啊。

 【webHobo】:
 Package and ClassPath (静水流深第一版)
     这是我的读书笔记,希望能够对大家学习java有所帮助。
 所有代码都经过测试,测试环境:
 java version "1.4.0-rc"
 Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-rc-b91)
 Java HotSpot(TM) Client VM (build 1.4.0-rc-b91, mixed mode)
     如大家发现任何错误,或有任何意见请不吝赐教。
                             quietwater
                              2003.2.4
         写作初衷
     首先是我自己遇到了有关package和classpath的问题,经过网友的帮助和
 自己的摸索,终于搞清楚原因。后来发现有些网友有着和我同样的问题,所以
 决定写篇文章来和大家分享。

 正文:
 一.private,friendly,protected,public的区别:

     private顾名思义就是私有,自己所以自己所用。
 包括私有成员变量和私有成员函数, 只有它们所属
 的类中的成员函数(包括public friendly 
 protected and private 也就是所有)可以调用。
     public就是共有,大家所以,可以被任何class
 调用。
     friendly友好,可以被同一个包中的class调用。
 如果没有明确声明属于哪一个包package,那么就只
 可以被同一个目录中的class调用。因为缺省同一个
 目录中的class属于同一个package。
     protected保护,它具有friendly的属性,也就是
 说它是friendly的超集,protected还可以被子类访问。
 二. 缺省package与friendly:
     默认情况下在同一个目录下的所有class 在同一个
 package 中。所以我们在默认情况下可以调用在同一个
 目录中的class 。缺省情况下它们都是friendly。
     如果是j2sdk1.4那么我们可以不配置classpath。
 但是如果你想import你自己的package ,那么你就必须
 配置classpath 了。
 三. 问题出在哪里?
     举例说明:
 d:\mypackage\A.java
 package mypackage;
 public class A{
   public A(){
     System.out.println("Create A");
   }
 }
 d:\mypackage\B.java
 import mypackage.*;
 class B{
   B(){
     System.out.println("Create B");
   }
   public static void main(String[] args){
     A a=new A();
     B b=new B();
   
 }
     
 首先set classpath=.;d:\
 表示到当前目录和d盘根目录查找包,包名与目录名一致。如mypackage包
 位于d:\mypackage  java通过classpath找到d:\然后通过包名找到
 d:\mypackage目录,在d:\mypackage目录下找到A.class
 D:\mypackage>javac A.java 没问题
 D:\mypackage>javac B.java
 B.java:7: cannot access A
 bad class file: .\A.class
 class file contains wrong class: mypackage.A
 Please remove or make sure it appears in the correct subdirectory of the classpa
 th.
     A a=new A();
     ^
 1 error
 将B.java移至d:\B.java然后运行
 D:\>javac B.java
 D:\>java B
 Create A
 Create B
 一切正常。
     总结:因为B class不在mypackage中,也就是说B class 要使用在mypackage 中的class,那么class B应该位于mypackage包所在目录之外才能避免冲突。不然默认class B
 与它所在目录的class位于同一个package中。
 如想运行包中的类,如下:
  D:\mypackage>java A
 Exception in thread "main" java.lang.NoClassDefFoundError: A (wrong name: mypack
 age/A)
         at java.lang.ClassLoader.defineClass0(Native Method)
         at java.lang.ClassLoader.defineClass(ClassLoader.java:509)
         at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:12
 3)
         at java.net.URLClassLoader.defineClass(URLClassLoader.java:246)
         at java.net.URLClassLoader.access$100(URLClassLoader.java:54)
         at java.net.URLClassLoader$1.run(URLClassLoader.java:193)
         at java.security.AccessController.doPrivileged(Native Method)
         at java.net.URLClassLoader.findClass(URLClassLoader.java:186)
         at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
         at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:265)
         at java.lang.ClassLoader.loadClass(ClassLoader.java:262)
         at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:322)
 写全名包名+类名如下:
 D:\mypackage>java mypackage.A
 Exception in thread "main" java.lang.NoSuchMethodError: main 
 改写A.java如下,添加main()
 package mypackage;
 public class A{
   public A(){
     System.out.println("Create A");
   }
   public static void main(String[] args){
     A a=new A();
   }
 }
 D:\mypackage>java mypackage.A【试验不正确】
 Create A
 D:\mypackage>javac A.java
 D:\mypackage>cd..
 D:\java mypackage.A   『试验正确的代码』 



 【viviandou2】:
 错误信息如下:
 aaa.java:2: cannot resolve symbol
 symbol  : class aa
 location: class test.aaa
 public class aaa extends aa
                          ^
 aaa.java:6: cannot resolve symbol
 symbol  : variable abc
 location: class test.aaa
         return abc;
                ^
 2 errors