问题描述
通常,如果 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:private 修饰符的访问级别仅在类内。无法从类外部访问它。
- 默认:默认修饰符的访问级别仅在包内。它不能从包外部访问。如果您没有指定任何访问级别,它将是默认值。
- Protected:protected 修饰符的访问级别通过子类在包内和包外。如果不创建子类,则无法从包外部访问它。
- 公共:公共修饰符的访问级别无处不在。它可以从类内、类外、包内和包外访问。
在您的情况下,您访问 type
类中的 Pass
变量。因此,即使它是私有变量,您也有权访问它。
因为方法在同一个类中,所以可以访问其他实例的私有成员。 private
仅表示只有类中的函数可以访问它,对访问的对象没有限制。