【问题标题】:Java Package and Access ModifierJava 包和访问修饰符
【发布时间】:2013-12-01 04:41:21
【问题描述】:

我创建了一个目录 p1,在该目录下我编写了一个 Demo.java 程序:-

package p1;

public class Demo {

     public static void main(String[] args){
         Protection ob1 = new Protection();
         Derived ob2 = new Derived();
         SamePackage ob3 = new SamePackage();
    }
}

在同一个目录下,我为 Protection.java、Derived.java、SamePackage.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_pro = " + n_pro);
        System.out.println("n_pub = " + n_pub);
    }
}  

package p1;

class Derived extends Protection {

    Derived(){
        System.out.println("derived Constructor.");
        System.out.println("n = " + n);

        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_pro = " + p.n_pro);
        System.out.println("n_pub = " + p.n_pub);
    }
}  

但是当我在 p1 文件夹中执行 javac Demo.java 时,我收到一个错误,它找不到保护、派生和 SamePackage 符号。我弄错了这里可能有什么问题? 任何线索将不胜感激。

【问题讨论】:

  • @KamleshArya ,所有类都在同一个oackage中,所以不需要导入它们..

标签: java oop package


【解决方案1】:

您的问题与访问说明符无关,它与编译期间缺少必需的类有关。

在编译Demo 类之前,您需要编译Protection & Derived 类。由于您在 Demo 类中的代码使用的是 Protection 和 Derived 类,因此应编译这些类,否则编译器将无法找到这些类并在 Demo 类编译期间产生错误。

根据你的类,编译顺序应该是:

  1. 保护(独立类)
  2. 派生(取决于保护)
  3. 演示(取决于保护和派生)

【讨论】:

  • @user1590011 它与访问说明符无关。此规则适用于引用任何其他类的任何类。
  • @R.J 如果所有类都在同一个包中,我认为不需要导入。
  • 在这里,当我尝试编译派生类时,我遇到了同样的错误,它说找不到符号保护和其他错误,例如找不到符号 n 和 n_pro, n_pub。
  • @user1590011 我在编辑的答案中提到了编译顺序。
  • 我在编译保护后编译 Derived 但即使这样我也收到错误,即我首先编译 Protection.java 文件,然后是 Derived.java 。 Protection.java 正在编译,没有任何故障
【解决方案2】:

首先编译ProtectionDerived。然后编译Demo类。

【讨论】:

    【解决方案3】:

    规则:

    Compile the composing classes BEFORE compiling the composed classes.
    

    示例:

    package com.vivek.one;
    
    class A{
    
    
    
    }
    
    package com.vivek.two;
    
    class B{
    
    
    
    }
    
    
    package com.vivek.three;
    
    import  com.vivek.one.A;
    import  com.vivek.two.B;
    
    class C{
    
      A a = new A();
      B b = new B();
    
    }
    

    编译:

    javac A.java
    javac B.java
    javac C.java
    

    跑步:

    java C
    

    【讨论】:

    • 感谢您清楚地阐明规则。但是当我们不打包类时,编译器会自动找到相关的类并编译它们不是这样吗?
    • @user1590011 没有编译器不会自动编译...你必须手动编译..
    • @KuldeepChoudhary 尝试编译上述类而不在顶部进行任何包声明,即所有类都在默认包中,然后您可以直接编译 Demo.java 并运行它。
    • @user1590011 ,对不起,我没有仔细阅读你的上层评论,我回答了你的问题上下文......只有当我们使用包装时编译才是强制性的......不需要默认包....
    【解决方案4】:

    通过执行此命令>javac -d按此顺序编译。文件名.java

     Protection-->>SamePackage-->>Derived-->>Demo
    

    所有文件编译后使用>java p1.Demo.java

    肯定对你有用

    【讨论】:

      【解决方案5】:

      这里的所有答案都表明我需要按特定顺序编译才能解决此问题。

      但对我有用的是我跑步时

          >javac Demo.java Protection.java SamePackage.java Derived.java
      

      即我同时编译了所有各种依赖的源代码。

      我现在知道什么有效,但现在我的好奇心迫使我知道为什么有效?我将此作为问题的一部分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-25
        • 2017-08-17
        • 2021-12-17
        • 1970-01-01
        • 2015-11-26
        • 1970-01-01
        • 2011-10-15
        相关资源
        最近更新 更多