从同一个类的不同实例访问私有方法

时间:2017-04-22 06:35:02

标签: java oop installation instance-variables access-modifiers

我刚遇到一个代码。在一种情况下,我无法使用其实例访问类的私有成员(这很好),但在其他情况下,我能够访问具有不同实例的私有成员(属于同一类)。谁能解释一下为什么会发生这种情况?

 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.*/
    }
}

4 个答案:

答案 0 :(得分:1)

您可以从同一类中定义的任何代码块访问私有成员。实例是什么,或者即使有任何实例(代码块在静态上下文中)也无关紧要。

但是您无法从不同类中定义的代码访问它们。

您的第一个引用属于同一个类Complex,这就是它的工作原理。第二个是不同的班级,Main,这就是为什么它不起作用。

答案 1 :(得分:0)

原因是类Main无法访问其他类的私有字段。在这种情况下,Complex类的私有字段 您只能从此类中的方法访问Complex类中的私有字段。换句话说,如果将main方法移到Complex类,则代码将被编译 如果要从Complex(或其他类)获取/设置Main类中的值,则应在Complex类中添加setter / getters。

答案 2 :(得分:0)

以下是解释访问修饰符的表格:

enter image description here

如您所见,在private行中,除N列外,所有内容均为Class。这意味着您可以访问私有成员,只要您在声明它们的同一个类中访问它们即可。您甚至可以使用实例从同一类中的静态上下文访问私有非静态成员。没有访问修饰符只允许来自同一实例的访问。

为什么?

因为在编译时确定thisc是否是同一个实例是一件痛苦的事。您必须实际运行代码以查看它们是否指向同一实例。

答案 3 :(得分:0)

从概念上讲,访问说明符是@ class level,而不是@ instance level。

以下可能是保持访问说明符@ class level的原因。 从JLS Documentation开始,我们可以清楚地看到访问权限是针对正在根据合同实施(或使用类/包)的用户。

简单来说,作为一个开发人员(用户),我所关心的是可用的成员(变量,方法)是什么,他们做了什么,我如何使用它们(抽象概念的基础)。 / p>

在您的情况下,它是同一个类,它具有访问其成员的所有权限,因此也可以访问观察到的行为。