在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
,因为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 可见性。 他们不会在课堂外被访问。您混淆了“类”和“对象”(或“实例”)。 【参考方案1】:Java 访问修饰符有四种类型:
-
Private:private 修饰符的访问级别仅在类内。不能从课堂外访问它。
默认:默认修饰符的访问级别仅在包内。无法从包外部访问它。如果您未指定任何访问级别,则将是默认级别。
Protected:protected修饰符的访问级别在包内,通过子类在包外。如果您不创建子类,则无法从包外部访问它。
公共:公共修饰符的访问级别无处不在。可以从类内、类外、包内、包外访问。
在您的情况下,您访问 type
类中的 Pass
变量。因此,即使它是私有变量,您也有权访问它。
【讨论】:
【参考方案2】:因为方法在同一个类中,它可以访问其他实例的私有成员。 private
只表示只有类中的函数可以访问它,不限制访问哪个对象。
【讨论】:
以上是关于在Java中,如果这样写,为啥私有数据成员可以在类外部访问? [复制]的主要内容,如果未能解决你的问题,请参考以下文章