建立了两个包  别为p1 p1下有类Protection.java  SamePackage.java Derived.java Demo.java分别存在四个不同的.java文件代码如下:
package p1;public class Protection{
int n=1;
private int n_pri=2;
protected int n_pro=3;
public int n_pub=4;

public Protection(){
System.out.println("base constructor");
System.out.println("n= "+n);
System.out.println("n_pri= "+n_pri);
System.out.println("n_pro= "+n_pro);
System.out.println("N_pub= "+n_pub);
}
}
package p1;class SamePackage{
SamePackage(){
Protection p=new Protection();
System.out.println("Same package constructor");
System.out.println("n= "+p.n); System.out.println("n_pri= "+p.n_pri);
System.out.println("n_pro= "+p.n_pro);
System.out.println("n_pub= "+p.n_pub);
}
}
package p1;class Derived extends Protection{
Derived(){
System.out.println("derived constructor");
System.out.println("n= "+n); System.out.println("n_pri= "+n_pri);
System.out.println("n_pro="+n_pro);
System.out.println("n_pub"+n_pub);
}
}
package p1;public class Demo{
public static void main(String args[]){
Protection ob1=new Protection();
Derived ob2=new Derived();
SamePackage ob3=new SamePackage();
}
}
应该是在每个目录下先编译出.class文件 再在上一级目录上
java p1.Demo但为什么编译.class  文件出错更别提最后的结果了请高手帮忙解决并顺便回答一下为什么

解决方案 »

  1.   

    是你的classpath这个环境变量没有设置吧
    你先可以试试在 命令提示符(或者win98的MS-DOS)中,先set classpath=%classpath%;(再这里再加上你上文所说的"上一级目录"的具体路径)举个例子就是如果你的路径为c:\sjg\p1的话,你的环境变量就应该为..
    set classpath=%classpath%;c:\sjg
    你先这样试试,如果再有问题 继续跟帖
      

  2.   

    一看你就是在jdk下作的
    在jdk下做一般不要用包。
    编译麻烦,而且易出错,
    把包去掉肯定对(如果你的code没错的话)。
      

  3.   

    不同意上面的观点...
    只是要清楚私有属性是只能在本类中可见的..不能直接由对象名.属性来访问,如:p.n_pri
    所它的private改成public 和protected ..通过
      

  4.   

    包中的类必须是public才能被另外的程序引用!你可以你的工程目录下自己手动建立的p1子文件夹把那四个类放入其中,
    在工程目录下有一个文件Demo.java用到了包p1,且在Demo.java文件的第一行你必须加import p1.*;
    如果没有用import p1.*;的话你要用p,只能用p.Protection。这时你可以在工程目录下,直接:javac Demo.java;java Demo运行程序,不用那么麻烦的!包文件,包中的类文件,还有包含main的类文件层次结构如下:
    e:\你的工程文件名
         class MyTest.java
         p1    ///包名
              Protection.java
              .......其他包中的类文件。
      

  5.   

    private 属性是私有的,除了自己本身,任何方法和类都不能调用
      

  6.   

    另外说明一点:如果你按我说的建立文件目录的话!
    在你编译含main的类时会自动编译包p1中的类!而不用另外编译包中的文件!
      

  7.   

    私有属性只能由本类来访问,你在SamePackage类中是不能用P.变量名来访问Protection类中的私有变量的,你必须在Protection类中编写一个公有的方法来访问私有变量,然后在SamePackage类中用P.方法名()来访问Protection类中的私有变量。
    同时在Derived类中虽然你继承了Protection类,但是Protection类中的私有变量对于子类来说也是不能访问的,所以你也要通过先前在父类中编写的公有方法来访问父类的私有变量。
    最后就是上面别人说的CLASSPATH的路径设置问题了。