Java中有四种访问修饰符,它们分别是public、private、protected和默认(即不加任何修饰符)。这些修饰符可以用来控制类、变量和方法的可见性和访问权限。
1.public修饰符表示该类、变量或方法可以被任何其他类访问。在同一个包内或者不同的包内都可以使用。
2.private修饰符表示该类、变量或方法只能被当前类中的其他方法所访问,其他类无法直接访问。
3.protected修饰符表示该类、变量或方法可以被同一个包内的其他类以及不同包中的子类所访问。
4.默认(即不加任何修饰符)表示该类、变量或方法只能被同一个包内的其他类所访问,而不能被不同包中的其他类所访问。
让我举几个例子来说明这些访问修饰符的区别。
假设我们有一个类叫做Person,它有一个成员变量叫做name和一个方法叫做speak()。
1.public修饰符:如果我们在Person类中使用public修饰符来声明name和speak()方法,那么其他任何类都可以访问它们。例如:
public class Person {
public String name;
public void speak() {
System.out.println("Hello, my name is " + name);
}
}
现在,在其他任何类中,我们都可以直接访问Person对象的name变量和speak()方法:
Person p = new Person();
p.name = "John";
p.speak(); // 输出: Hello, my name is John
2.private修饰符:如果我们在Person类中使用private修饰符来声明name和speak()方法,那么只有Person类内部的其他方法才能够访问它们。例如:
public class Person {
private String name;
private void speak() {
System.out.println("Hello, my name is " + name);
}
}
现在,在其他任何类中,我们无法直接访问Person对象的name变量和speak()方法:
Person p = new Person();
p.name = "John"; // 编译错误!无法访问私有变量
p.speak(); // 编译错误!无法访问私有方法
3.protected修饰符:如果我们在Person类中使用protected修饰符来声明name和speak()方法,那么同一包内的其他类以及不同包中的子类都可以访问它们。例如:
package com.example;
public class Person {
protected String name;
protected void speak() {
System.out.println("Hello, my name is " + name);
}
}
package com.example.sub;
import com.example.Person;
public class Student extends Person {
public void introduce() {
System.out.println("I am a student and my name is " + this.name);
this.speak();
}
}
现在,在com.example.sub包下的Student类中,我们可以直接访问从父类继承而来的name变量和speak()方法:
Student s = new Student();
s.name = "Tom";
s.introduce(); // 输出: I am a student and my name is Tom; Hello, my name is Tom
4.默认(即不加任何修饰符):如果我们在Person类中不加任何修饰符来声明name和speak()方法,则只有同一包内的其他类才能够访问它们。例如:
package com.example;
class Person {
String name;
void speak() {
System.out.println("Hello, my name is " + name);
}
}
package com.example.sub;
import com.example.Person;
public class Student {
public void introduce(Person p) {
p.name = "Lucy";
p.speak();
}
}
现在,在com.example.sub包下的Student类中,我们只能通过传递一个同一包内的Person对象来间接地访问其name变量和speak()方法:
Student s = new Student();
Person p = new Person();
s.introduce(p); // 输出: Hello, my name is Lucy