在Java中,为什么私有数据成员可以在class之外访问,如果这样写?
In Java, why are the private data members accessible outside the class if written like this?
通常,如果 type
是名为 Pass
的 class 的 private 成员,并且 obj
是引用对于 Pass
class 的对象,我们不能做 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);
}
}
因为方法在同一个class中,所以可以访问其他实例的私有成员。 private
only 表示只有 class 中的函数 可以访问它,对哪个对象正在访问没有限制。
有四种类型的 Java 访问修饰符:
- Private:private修饰符的访问级别仅在class内。无法从 class.
外部访问
- Default: 默认修饰符的访问级别仅在包内。无法从包外访问它。如果您不指定任何访问级别,它将是默认值。
- Protected:protected修饰符的访问级别是包内包外通过childclass。如果不制作childclass,则无法从包外访问。
- Public:public修饰符的访问级别无处不在。它可以从 class 内、class 外、包内和包外访问。
在您的例子中,您访问 Pass
class 中的 type
变量。所以即使它是一个私有变量,你也有访问它的权限。
通常,如果 type
是名为 Pass
的 class 的 private 成员,并且 obj
是引用对于 Pass
class 的对象,我们不能做 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);
}
}
因为方法在同一个class中,所以可以访问其他实例的私有成员。 private
only 表示只有 class 中的函数 可以访问它,对哪个对象正在访问没有限制。
有四种类型的 Java 访问修饰符:
- Private:private修饰符的访问级别仅在class内。无法从 class. 外部访问
- Default: 默认修饰符的访问级别仅在包内。无法从包外访问它。如果您不指定任何访问级别,它将是默认值。
- Protected:protected修饰符的访问级别是包内包外通过childclass。如果不制作childclass,则无法从包外访问。
- Public:public修饰符的访问级别无处不在。它可以从 class 内、class 外、包内和包外访问。
在您的例子中,您访问 Pass
class 中的 type
变量。所以即使它是一个私有变量,你也有访问它的权限。