在Java中,如果这样写,为什么私有数据成员可以在类外访问?

问题描述

通常,如果 type 是名为 Pass 的类的 private 成员,并且 obj 是对 Pass 类的对象的引用,我们不能做 obj.type 因为 typeprivate 成员,所以会出错。

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 访问修饰符有四种类型:

  1. Private:private 修饰符的访问级别仅在类内。无法从类外部访问它。
  2. 默认:默认修饰符的访问级别仅在包内。它不能从包外部访问。如果您没有指定任何访问级别,它将是默认值。
  3. Protected:protected 修饰符的访问级别通过子类在包内和包外。如果不创建子类,则无法从包外部访问它。
  4. 公共:公共修饰符的访问级别无处不在。它可以从类内、类外、包内和包外访问。

在您的情况下,您访问 type 类中的 Pass 变量。因此,即使它是私有变量,您也有权访问它。

,

因为方法在同一个类中,所以可以访问其他实例的私有成员。 private 仅表示只有类中的函数可以访问它,对访问的对象没有限制。