原文: https://www.programiz.com/java-programming/access-modifiers
在 Java 中,访问修饰符用于设置类,接口,变量,方法,构造器,数据成员和设置器方法的可见性(可见性)。 例如,
class Animal {
public void method1() {...}
private void method2() {...}
}
在上面的示例中,我们声明了 2 个方法:method1()
和method2()
。 这里,
method1
是public
- 这意味着可以由其他类访问。method2
为private
- 这意味着其他类无法访问它。
注意关键字public
和private
。 这些是 Java 中的访问修饰符。 它们也称为可见性修改器。
注意:您无法设置获取器方法的访问修饰符。
在学习访问修饰符的类型之前,请确保您了解 Java 包。
Java 中有四个访问修饰符关键字,它们是:
修饰符 | 说明 |
---|---|
默认 | 声明仅在包中可见(包私有) |
private |
声明仅在类中可见 |
protected |
声明在包或所有子类中均可见 |
public |
声明随处可见 |
如果我们未为类,方法,变量等明确指定任何访问修饰符,则默认情况下将考虑默认访问修饰符。 例如,
package defaultPackage;
class Logger {
void message(){
System.out.println("This is a message");
}
}
此处,Logger
类具有默认的访问修饰符。 并且该类对属于defaultPackage
包的所有类都是可见的。 但是,如果尝试在defaultPackage
之外的另一个类中使用Logger
类,则会出现编译错误。
声明变量和方法private
时,不能在类外部访问它们。 例如,
class Data {
// private variable
private String name;
}
public class Main {
public static void main(String[] main){
// create an object of Data
Data d = new Data();
// access private variable and field from another class
d.name = "Programiz";
}
}
在上面的示例中,我们声明了一个名为name
的私有变量,和一个名为display()
的私有方法。 运行程序时,将出现以下错误:
Main.java:18: error: name has private access in Data
d.name = "Programiz";
^
产生错误是因为我们试图从Main
类访问Data
类的私有变量和私有方法。
您可能想知道我们是否需要访问这些私有变量。 在这种情况下,我们可以使用获取器和设置器方法。 例如,
class Data {
private String name;
// getter method
public String getName() {
return this.name;
}
// setter method
public void setName(String name) {
this.name= name;
}
}
public class Main {
public static void main(String[] main){
Data d = new Data();
// access the private variable using the getter and setter
d.setName("Programiz");
System.out.println(d.getName());
}
}
输出:
The name is Programiz
在上面的示例中,我们有一个名为name
的私有变量。 为了从外部类访问变量,我们使用了方法:getName()
和setName()
。 这些方法在 Java 中称为获取器和设置器。
在这里,我们使用了设置器方法(setName()
)将值分配给变量,并使用获取器方法(getName()
)来访问变量。
我们在setName()
中使用了this
关键字来引用该类的变量。 要了解有关this
关键字的更多信息,请访问 Java this
关键字。
注意:我们无法在 Java 中声明私有的类和接口。 但是,可以将嵌套类声明为私有。 要了解更多信息,请访问 Java 嵌套和内部类。
当方法和数据成员被声明为protected
时,我们可以在同一包中以及从子类中访问它们。 例如,
class Animal {
// protected method
protected void display() {
System.out.println("I am an animal");
}
}
class Dog extends Animal {
public static void main(String[] args) {
// create an object of Dog class
Dog dog = new Dog();
// access protected method
dog.display();
}
}
输出:
I am an animal
在上面的示例中,我们在Animal
类中有一个名为display()
的受保护方法。Animal
类由Dog
类继承。 要了解有关继承的更多信息,请访问 Java 继承。
然后,我们创建了Dog
类的对象Dog
。 使用该对象,我们尝试访问父类的受保护方法。
由于可以从子类访问受保护的方法,因此我们可以从Dog
类访问Animal
类的方法。
注意:我们无法在 Java 中声明类或接口protected
。
当方法,变量,类等被声明为public
时,我们可以从任何地方访问它们。 公共访问修饰符没有范围限制。 例如,
// Animal.java file
// public class
public class Animal {
// public variable
public int legCount;
// public method
public void display() {
System.out.println("I am an animal.");
System.out.println("I have " + legCount + " legs.");
}
}
// Main.java
public class Main {
public static void main( String[] args ) {
// accessing the public class
Animal animal = new Animal();
// accessing the public variable
animal.legCount = 4;
// accessing the public method
animal.display();
}
}
输出:
I am an animal.
I have 4 legs.
这里,
- 可从
Main
类访问公共类Animal
。 - 可从
Main
类访问公共变量legCount
。 - 可从
Main
类访问公共方法display()
。
Java 中所有访问修饰符的可见性
访问修饰符主要用于封装。 我可以帮助我们控制程序的哪些部分可以访问类的成员。 这样就可以防止滥用数据。 要了解有关封装的更多信息,请访问 Java 封装。