我刚遇到一个代码。在一种情况下,我无法使用其实例访问类的私有成员(这很好),但在其他情况下,我能够访问具有不同实例的私有成员(属于同一类)。谁能解释一下为什么会发生这种情况?
class Complex {
private double re, im;
public String toString() {
return "(" + re + " + " + im + "i)";
}
Complex(){}
/*Below c is different instance, still it can access re,im( has a private access)
without any error.why? */
Complex(Complex c) {
re = c.re;
im = c.im;
}
}
public class Main {
public static void main(String[] args) {
Complex c1 = new Complex();
Complex c2 = new Complex(c1);
System.out.println(c1.re); /* But getting an error here ,
which is expected as re and im has a private access in Complex class.*/
}
}
答案 0 :(得分:1)
您可以从同一类中定义的任何代码块访问私有成员。实例是什么,或者即使有任何实例(代码块在静态上下文中)也无关紧要。
但是您无法从不同类中定义的代码访问它们。
您的第一个引用属于同一个类Complex
,这就是它的工作原理。第二个是不同的班级,Main
,这就是为什么它不起作用。
答案 1 :(得分:0)
原因是类Main
无法访问其他类的私有字段。在这种情况下,Complex
类的私有字段
您只能从此类中的方法访问Complex
类中的私有字段。换句话说,如果将main
方法移到Complex
类,则代码将被编译
如果要从Complex
(或其他类)获取/设置Main
类中的值,则应在Complex
类中添加setter / getters。
答案 2 :(得分:0)
以下是解释访问修饰符的表格:
如您所见,在private
行中,除N
列外,所有内容均为Class
。这意味着您可以访问私有成员,只要您在声明它们的同一个类中访问它们即可。您甚至可以使用实例从同一类中的静态上下文访问私有非静态成员。没有访问修饰符只允许来自同一实例的访问。
为什么?
因为在编译时确定this
和c
是否是同一个实例是一件痛苦的事。您必须实际运行代码以查看它们是否指向同一实例。
答案 3 :(得分:0)
从概念上讲,访问说明符是@ class level,而不是@ instance level。
以下可能是保持访问说明符@ class level的原因。 从JLS Documentation开始,我们可以清楚地看到访问权限是针对正在根据合同实施(或使用类/包)的用户。
简单来说,作为一个开发人员(用户),我所关心的是可用的成员(变量,方法)是什么,他们做了什么,我如何使用它们(抽象概念的基础)。 / p>
在您的情况下,它是同一个类,它具有访问其成员的所有权限,因此也可以访问观察到的行为。