2017-06-17 106 views
1
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); 
} 
} 

包P2包P1不存在包含三个文件demo.java,OtherPackage.java和Protection2.java:错误:从包编译Java文件P2

//Demo package p2. 
package p2; 

//Instantiate various classes in p2. 
public class Demo { 
public static void main(String[] args) { 
    Protection2 ob1 = new Protection2(); 
    OtherPackage ob2 = new OtherPackage(); 
} 
} 

package p2; 

OtherPackage.java

class OtherPackage { 
OtherPackage() { 
    p1.Protection p = new p1.Protection(); 
    System.out.println("Other package constructor"); 

    //class or package only 
    //System.out.println("n = " + p.n); 

    //class only 
    //System.out.println("n_pri = " + p.n_pri); 

    //class, subclass or package only 
    //System.out.println("n_pro = " + p.n_pro) 

    System.out.println("n_pub = " + p.n_pub); 
} 
} 

和Protection2.java

package p2; 

class Protection2 extends p1.Protection { 
Protection2() { 
    System.out.println("Derived other package constructor"); 

    //class or package only 
    //System.out.println("n = " + n); 

    //class only 
    //System.out.println("n_pri = " + n_pri); 

    System.out.println("n_pro = " + n_pro); 
    System.out.println("n_pub = " + n_pub); 
} 
} 

我试图从包P2编译Demo.java:

:~/Desktop/Examples/p2$ javac *.java 

I产生以下错误

Protection2.java:3: error: package p1 does not exist 
class Protection2 extends p1.Protection { 
         ^
OtherPackage.java:5: error: package p1 does not exist 
    p1.Protection p = new p1.Protection(); 
    ^
OtherPackage.java:5: error: package p1 does not exist 
    p1.Protection p = new p1.Protection(); 
          ^
Protection2.java:13: error: cannot find symbol 
    System.out.println("n_pro = " + n_pro); 
            ^
    symbol: variable n_pro 
    location: class Protection2 
Protection2.java:14: error: cannot find symbol 
    System.out.println("n_pub = " + n_pub); 
            ^
    symbol: variable n_pub 
    location: class Protection2 
5 errors 

我试图导入包P1,但它与上述5个错误沿着增加了另一个错误:

Demo.java:4: error: package p1 does not exist 
import p1.Protection; 
+1

试试'CD〜/桌面/ Examples'和编译'P2/* java' – ajb

+1

,因为你还没有告诉它在哪里寻找它找不到'p1',所以只默认在当前目录中查找,并且当前目录中不存在“p1”。做@ajb所说的,即从父目录运行编译器,所以'p1'和'p2'都存在于当前目录中。另外,如果你坚持从'p2'运行编译器,就这样做:'javac -cp .. * .java' – Andreas

回答

0

我做了这个目录结构:

    package 
        | 
     ---------------------------- 
     |       | 
    source      bin 
     |       | 
(All .java files)  (Package folders after compilation) 

Java文件:

Protection.java

package p1; 

public class Protection { 

    public int m_Pub; 

    int m_N; 
    private int m_Pri; 
    protected int m_Pro; 

    public Protection() { 
     m_Pub = 4; 
     m_N = 1; 
     m_Pri = 2; 
     m_Pro = 3; 

     System.out.println ("Base Constructor"); 
     System.out.println ("m_Pub = " + m_Pub); 
     System.out.println ("m_N = " + m_N); 
     System.out.println ("m_Pri = " + m_Pri); 
     System.out.println ("m_Pro = " + m_Pro); 
    } 
} 

Demo.java

package p2; 

public class Demo { 

    public static void main (String [] args) { 
     Protection2 protection2 = new Protection2(); 
     OtherPackage otherPackage = new OtherPackage(); 
    } 
} 

OtherPackage.java

package p2; 

import p1.Protection; 

public class OtherPackage { 

    public OtherPackage() { 
     Protection protection = new Protection(); 
     System.out.println ("OtherPackage Constructor"); 
    } 
} 

Protection2.java

package p2; 

import p1.Protection; 

public class Protection2 extends Protection { 

    public Protection2() { 
     System.out.println ("Derived Protection2 Constructor"); 
     System.out.println ("m_Pro = " + m_Pro); 
     System.out.println ("m_Pub = " + m_Pub); 
    } 
} 

汇编:

[email protected] /cygdrive/c/mine/java/package 
$ javac -d bin source/*.java 

执行:

[email protected] /cygdrive/c/mine/java/package 
$ cd bin 

[email protected] /cygdrive/c/mine/java/package/bin 
$ java p2.Demo 
Base Constructor 
m_Pub = 4 
m_N = 1 
m_Pri = 2 
m_Pro = 3 
Derived Protection2 Constructor 
m_Pro = 3 
m_Pub = 4 
Base Constructor 
m_Pub = 4 
m_N = 1 
m_Pri = 2 
m_Pro = 3 
OtherPackage Constructor 

[email protected] /cygdrive/c/mine/java/package/bin 

问题在于,编译时未能指定,在哪里查找package p1,因为您位于文件夹p2内。在编译过程中,您需要放置所有.java文件。

如果你试图让每个.java文件在其各自的package文件夹,然后它是这样的:

目录结构:

     package 
         | 
      ---------------------------- 
      |       | 
     source      bin 
      |       | 
    ------------  (Package folders after compilation) 
    |   | 
    p1   p2 
    |   | 
    |  Demo.java OtherPackage.java Protection2.java 
Protection.java 

编译:

[email protected] /cygdrive/c/mine/java/package 
$ javac -d bin source/p1/*.java source/p2/*.java 

执行:

[email protected] /cygdrive/c/mine/java/package 
$ cd bin 

[email protected] /cygdrive/c/mine/java/package/bin 
$ java p2.Demo 
Base Constructor 
m_Pub = 4 
m_N = 1 
m_Pri = 2 
m_Pro = 3 
Derived Protection2 Constructor 
m_Pro = 3 
m_Pub = 4 
Base Constructor 
m_Pub = 4 
m_N = 1 
m_Pri = 2 
m_Pro = 3 
OtherPackage Constructor 

[email protected] /cygdrive/c/mine/java/package/bin