Java中的访问修饰符
顾名思义, Java中的访问修饰符有助于限制类、构造函数、变量、方法或数据成员的范围。 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指定的。
- 声明为私有的方法或数据成员只能在声明它们的类中访问。
- 同一包的任何其他类将无法访问这些成员。
- 顶级类或接口不能声明为私有,因为
- private 表示“仅在封闭类中可见”。
- 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
要点:
- 如果其他程序员使用您的类,请尝试使用对特定成员有意义的最严格的访问级别。除非您有充分的理由不这样做,否则请使用私有。
- 避免使用除常量之外的公共字段。