【问题标题】:In Java, why are the private data members accessible outside the class if written like this? [duplicate]在Java中,如果这样写,为什么私有数据成员可以在类外部访问? [复制]
【发布时间】:2021-08-16 03:35:14
【问题描述】:

通常,如果type 是名为Pass 的类的私有 成员,并且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);
    }
}

【问题讨论】:

  • private 意味着某些东西只能被同一类的东西访问。不仅来自同一个对象。
  • 可见性修饰符描述 class 可见性,而不是 object 可见性。
  • 他们不会在课堂外被访问。您混淆了“类”和“对象”(或“实例”)。

标签: java class private access-modifiers


【解决方案1】:

Java 访问修饰符有四种类型:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-12-11
      • 2014-04-02
      • 2014-03-13
      • 1970-01-01
      • 2017-08-16
      • 1970-01-01
      • 1970-01-01
      • 2014-06-21
      • 2019-05-12
      相关资源
      最近更新 更多