📜  Java中的访问修饰符

📅  最后修改于: 2022-05-13 01:54:49.278000             🧑  作者: Mango

Java中的访问修饰符

顾名思义, Java中的访问修饰符有助于限制类、构造函数、变量、方法或数据成员的范围。 Java中有四种类型的访问修饰符可用:

  1. 默认 - 不需要关键字
  2. 私人的
  3. 受保护
  4. 上市

访问修饰符-in-java

  • 默认:当没有为类、方法或数据成员指定访问修饰符时——据说默认情况下具有默认访问修饰符。
    • 未使用任何访问修饰符(即具有默认访问修饰符)声明的数据成员、类或方法只能在同一个包中访问。

在这个例子中,我们将创建两个包,包中的类将具有默认的访问修饰符,我们将尝试从第二个包的类中访问一个包中的类。

Java
// Java program to illustrate default modifier 
package p1; 
  
// Class Geeks is having Default access modifier 
class Geek 
{ 
    void display() 
    { 
        System.out.println("Hello World!"); 
    } 
}


Java
// Java program to illustrate error while 
// using class from different package with 
// default modifier 
package p2; 
import p1.*; 
  
// This class is having default access modifier 
class GeekNew 
{ 
    public static void main(String args[]) 
    { 
        // Accessing class Geek from package p1 
        Geeks obj = new Geek(); 
  
        obj.display(); 
    } 
}


Java
// Java program to illustrate error while 
// using class from different package with 
// private modifier 
package p1; 
  
class A 
{ 
private void display() 
    { 
        System.out.println("GeeksforGeeks"); 
    } 
} 
  
class B 
{ 
public static void main(String args[]) 
    { 
        A obj = new A(); 
        // Trying to access private method
        // of another class 
        obj.display(); 
    } 
}


Java
// Java program to illustrate 
// protected modifier 
package p1; 
  
// Class A 
public class A 
{ 
protected void display() 
    { 
        System.out.println("GeeksforGeeks"); 
    } 
}


Java
// Java program to illustrate 
// protected modifier 
package p2; 
import p1.*; // importing all classes in package p1 
  
// Class B is subclass of A 
class B extends A 
{ 
public static void main(String args[]) 
{ 
    B obj = new B(); 
    obj.display(); 
} 
      
}


Java
// Java program to illustrate 
// public modifier 
package p1; 
public class A 
{ 
public void display() 
    { 
        System.out.println("GeeksforGeeks"); 
    } 
}


Java
package p2;
import p1.*;
class B {
    public static void main(String args[])
    {
        A obj = new A;
        obj.display();
    }
}


Java

// Java program to illustrate error while 
// using class from different package with 
// default modifier 
package p2; 
import p1.*; 
  
// This class is having default access modifier 
class GeekNew 
{ 
    public static void main(String args[]) 
    { 
        // Accessing class Geek from package p1 
        Geeks obj = new Geek(); 
  
        obj.display(); 
    } 
} 

输出:

Compile time error
  • Private :private 访问修饰符是使用关键字private指定的。
    • 声明为私有的方法或数据成员只能在声明它们的类中访问。
    • 同一包的任何其他将无法访问这些成员。
    • 顶级类或接口不能声明为私有,因为
      1. private 表示“仅在封闭类中可见”。
      2. protected 表示“仅在封闭类和任何子类中可见”

因此,就应用于类而言,这些修饰符仅适用于嵌套类而不适用于顶级类

在这个例子中,我们将在同一个包 p1 中创建两个类 A 和 B。我们将 A 类中的一个方法声明为私有方法,并尝试从 B 类访问该方法并查看结果。

Java

// Java program to illustrate error while 
// using class from different package with 
// private modifier 
package p1; 
  
class A 
{ 
private void display() 
    { 
        System.out.println("GeeksforGeeks"); 
    } 
} 
  
class B 
{ 
public static void main(String args[]) 
    { 
        A obj = new A(); 
        // Trying to access private method
        // of another class 
        obj.display(); 
    } 
} 

输出:

error: display() has private access in A
        obj.display();
  • protected :受保护的访问修饰符是使用关键字protected指定的。
    • 声明为受保护的方法或数据成员可在同一包或不同包的子类中访问。

在本例中,我们将创建两个包 p1 和 p2。 p1 中的 A 类是公开的,以便在 p2 中访问它。类 A 中显示的方法是受保护的,类 B 是从类 A 继承的,然后通过创建类 B 的对象来访问此受保护的方法。

Java

// Java program to illustrate 
// protected modifier 
package p1; 
  
// Class A 
public class A 
{ 
protected void display() 
    { 
        System.out.println("GeeksforGeeks"); 
    } 
} 

Java

// Java program to illustrate 
// protected modifier 
package p2; 
import p1.*; // importing all classes in package p1 
  
// Class B is subclass of A 
class B extends A 
{ 
public static void main(String args[]) 
{ 
    B obj = new B(); 
    obj.display(); 
} 
      
} 

输出:

GeeksforGeeks
  • public :public 访问修饰符是使用关键字public指定的。
    • public 访问修饰符在所有其他访问修饰符中具有最广泛的范围
    • 声明为公共的类、方法或数据成员可以从程序中的任何位置访问。公共数据成员的范围没有限制。

Java

// Java program to illustrate 
// public modifier 
package p1; 
public class A 
{ 
public void display() 
    { 
        System.out.println("GeeksforGeeks"); 
    } 
}

Java

package p2;
import p1.*;
class B {
    public static void main(String args[])
    {
        A obj = new A;
        obj.display();
    }
}

输出:

GeeksforGeeks

要点:

  • 如果其他程序员使用您的类,请尝试使用对特定成员有意义的最严格的访问级别。除非您有充分的理由不这样做,否则请使用私有。
  • 避免使用除常量之外的公共字段。