通常,如果type
是名为Pass
的类的private成员,而obj
是对Pass
类的对象的引用,则我们不能执行obj.type
,因为type
是private成员,因此会出现错误。
在copy()
方法中,a
作为参数传递,其中a
是对Pass
对象的引用。
按照同样的逻辑,我们也不应该被允许做a.type
。
但是这个代码运行良好。为什么?这是我的疑问。
public class Main {
public static void main(String[] args) {
Pass ob1 = new Pass(10,'c');
Pass ob2 = new Pass(20,'f');
ob1.print();
ob2.print();
ob1.copy(ob2);
ob1.print();
ob2.print();
}
}
class Pass {
private int number = 0;
private char type = 'a';
public Pass(int i, char t) {
this.number = i;
this.type = t;
}
public void copy(Pass a) {
this.number = a.number;
this.type = a.type;
}
public void print() {
System.out.println(number + " =>" + type);
}
}
有四种类型的Java访问修饰符:
- Private:私有修饰符的访问级别仅在类中。不能从类外部访问它
- 默认:默认修饰符的访问级别仅在包中。无法从程序包外部访问它。如果您没有指定任何访问级别,它将是默认级别
- 受保护:受保护修饰符的访问级别在包内,通过子类在包外。如果不生成子类,则无法从包外部访问它
- Public:公共修饰符的访问级别无处不在。它可以从类内、类外、包内和包外访问
在您的情况下,您可以访问Pass
类中的type
变量。因此,即使它是一个私有变量,你也有权访问它
因为该方法在同一个类中,所以它可以访问其他实例的私有成员。private
仅意味着只有类中的函数才能访问它,而不限制哪个对象正在进行访问。