📜  Java的公共与包访问修饰符

📅  最后修改于: 2021-09-14 02:19:36             🧑  作者: Mango

每当我们编写我们的类时,我们必须向 JVM 提供一些关于我们的类的信息,比如这个类是否可以从任何地方访问,是否可以创建子类,是否可以创建对象等。我们可以通过在Java使用适当的关键字访问修饰符来指定此信息。因此访问修饰符用于设置类、方法和其他成员的可访问性。

让我们讨论这两个修饰符如下:

  • 公共访问修饰符
  • 包(默认)访问修饰符

修饰符 1:公共访问修饰符

如果一个类被声明为公共类,那么我们可以从任何地方访问该类。

我们将在该包中创建一个包 pack1,我们声明了一个公共的类 A,在该类中,我们声明了一个也是公共的方法 m1。现在我们创建另一个包 pack2 并在该包中导入 pack1 并声明一个类 B,在类 B 的 main 方法中,我们创建一个类 A 类型的对象并尝试访问方法 m1 的数据。

示例 1:

Java
// Java Program to illustrate  Public Access Modifiers
 
// creating a package
package pack1;
   
// import required packages
import java.io.*;
import java.util.*;
   
// declaring a public class
public class A {
     
    // declaring method m1
    public void m1() { System.out.println("GFG"); }
}


Java
// Java Program to illustrate  Public Access Modifiers
 
// creating a package
package pack2;
 
// importing class from above package
// package pack1
// import required packages
import java.io.*;
import java.util.*;
import pack1.A;
 
// Main class
class B {
 
    // Main driver method
    public static void main(String[] args)
    {
        // Creating an object of type class A
        A a = new A();
 
        // accessing the method m1()
        a.m1();
    }
}


Java
// Java Program to illustrate Package Level Access Modifier
 
// Importing utility classes
// Importing input output classes
import java.io.*;
import java.util.*;
 
// Main Class
class GFG {
 
    // Declaring default variables that is
    // having no access modifier
    String s = "Geeksfor";
    String s1 = "Geeks";
 
    // Method 1
    // To declare a default method
    String fullName()
    {
        // Concatenation of strings
        return s + s1;
    }
 
    // Method 2
    // Main driver method
    public static void main(String[] args)
    {
 
        // Creating an object of main class(GFG)
        // in the main() method
        GFG g = new GFG();
 
        // Calling method1 using class instance
        // and printing the concation of strings
        System.out.println(g.fullName());
    }
}


输出:使用以下命令行编译并保存上述代码:

这里我们将把上面创建的包的类导入到新创建的包中。

示例 2:

Java

// Java Program to illustrate  Public Access Modifiers
 
// creating a package
package pack2;
 
// importing class from above package
// package pack1
// import required packages
import java.io.*;
import java.util.*;
import pack1.A;
 
// Main class
class B {
 
    // Main driver method
    public static void main(String[] args)
    {
        // Creating an object of type class A
        A a = new A();
 
        // accessing the method m1()
        a.m1();
    }
}

输出说明:

如果在编译 B 类时 A 类不是公共的,我们将收到一个编译时错误,提示 pack1。 A 在 pack1 中不是公共的,不能从外部包访问。类似地,成员或方法或接口被声明为公共的,因为我们可以从任何地方访问该成员。

修饰符 2:包(默认)访问修饰符

一个没有任何访问修饰符的类或方法或变量声明然后被认为它有一个包(默认)访问修饰符默认修饰符在同一个包内作为公共的,在包外作为私有的。如果一个类被声明为默认,那么我们只能在当前包中访问该类,即从外部包中我们不能访问它。因此,默认访问修饰符也称为包级访问修饰符。类似的规则也适用于Java的变量和方法。

例子:

Java

// Java Program to illustrate Package Level Access Modifier
 
// Importing utility classes
// Importing input output classes
import java.io.*;
import java.util.*;
 
// Main Class
class GFG {
 
    // Declaring default variables that is
    // having no access modifier
    String s = "Geeksfor";
    String s1 = "Geeks";
 
    // Method 1
    // To declare a default method
    String fullName()
    {
        // Concatenation of strings
        return s + s1;
    }
 
    // Method 2
    // Main driver method
    public static void main(String[] args)
    {
 
        // Creating an object of main class(GFG)
        // in the main() method
        GFG g = new GFG();
 
        // Calling method1 using class instance
        // and printing the concation of strings
        System.out.println(g.fullName());
    }
}

输出:

GeeksforGeeks

最后,在对两者的理解和梳理之后,让我们总结一下它们之间的明显差异,如下表所示:

                  Public Access Modifier                  Package Access Modifier
Public members can be accessed from a non-child class of outside package. This modifier can’t be accessed from a non-child class of the outside package.
Public members can be accessed from child class of outside package. We cannot access this modifier from the child class of the outside package.
The public modifier is more accessible than the package access modifier. This modifier is more restricted than the public access modifier.