Java包和访问修饰符

Java包和访问修饰符,java,oop,package,Java,Oop,Package,我创建了一个目录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(); } }

我创建了一个目录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);
    }
}  

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

您的问题与访问说明符无关,它与编译过程中缺少必需的类有关

在编译
演示
类之前,您需要编译
保护
派生
类。由于演示类中的代码使用的是保护类和派生类,所以应该编译这些类,否则编译器将无法找到这些类,并在演示类编译期间生成错误

根据您的课程,编译顺序应为:

  • 保护(独立类)
  • 派生(取决于保护)
  • 演示(取决于保护和派生)

  • 首先编译
    保护
    派生
    。然后编译
    Demo
    类。

    规则:

    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
    
    示例:

    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
    
    编译:

    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
    
    跑步:

    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
    

    通过执行javac-d命令,按照这个顺序编译。FileName.java

     Protection-->>SamePackage-->>Derived-->>Demo
    
    编译完所有文件后,请使用>javap1.Demo.java

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

    当然它会对你有用

    这里的所有答案都建议我需要按照一定的顺序进行编译,以解决这个问题

    但对我有效的是当我跑步的时候

        >javac Demo.java Protection.java SamePackage.java Derived.java
    
    i、 我同时编译了所有不同的相关源代码


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

    @user1590011它与访问说明符无关。此规则适用于引用任何其他类的任何类。@R.J我认为如果所有类都在同一个包中,则不需要导入。在这里,当我尝试编译派生类时,我遇到了相同的错误,即“找不到符号保护”和其他错误,如找不到符号n和n_pro,n_pub@user1590011我在编辑后的回答中提到了编译顺序。我在编译Protection之后编译派生,但即使这样,我也会得到错误,即我首先编译Protection.java文件,然后编译Derived.java。java在编译时没有任何提示,以明确说明规则。但是当我们不打包这些类时,编译器会自动找到相关的类并编译它们,不是吗?@user1590011没有编译器会自动编译…你必须手动编译。@KuldeepChoudhary尝试编译上面的类,但顶部没有任何包贴花,即所有类都在默认包中然后您可以直接编译Demo.java并运行它。@user1590011,对不起,yar,我没有仔细阅读您上面的评论,我回答了您的问题上下文…只有在使用打包时才强制编译…不需要默认包…@KamleshArya,所有类都在同一个包中,所以不需要导入它们。。