在Java中,如果这样写,为啥私有数据成员可以在类外部访问? [复制]

Posted

技术标签:

【中文标题】在Java中,如果这样写,为啥私有数据成员可以在类外部访问? [复制]【英文标题】: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,因为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);
    

【问题讨论】:

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

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于在Java中,如果这样写,为啥私有数据成员可以在类外部访问? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

私有(private)成员

访问同一文件中类的私有成员的函数

封装 - 为啥我使用 getter setter 将我的数据成员公开,如果我已经在课堂上声明它们是私有的

如果在类中的成员没有加修饰符,则被认为是private的

为啥类的常量数据成员需要在构造函数中初始化?

python 04