1

以下代码可以完美运行。

public class Complex {

private int real, imag;

Complex(int r, int i) {
    real = r;
    imag = i;
}

public static Complex add(Complex c1, Complex c2) {
    return new Complex(c1.real + c2.real, c1.imag + c2.imag);
}

public String toString() {
    return real + "+i" + imag;
}

public static void main(String[] args) {

    Integer.parseInt("5");
    System.out.println(Complex.add(new Complex(2, 3), new Complex(3, 4)));

}

}

现在根据面向对象的设计模型,不应通过对象引用访问私有实例成员(此处已由 c1.real 完成)。

所以,从这个意义上说,应该有编译器错误。但它不反对。

现在根据我的理解是允许的,因为

  1. c1.real 代码写在私有类Complex 类本身的主体中。

  2. Complex 类的开发人员在通过对象引用访问时应该有权访问所有实例成员[无论是私有的、受保护的],因为与任何第三方不同,开发人员非常清楚自己在做什么。这就是为什么这里不遵循面向对象的模型模型的原因。

任何人都可以建议更好地解释为什么这里允许 c1.real 代码吗?

4

2 回答 2

4

私有意味着它不能被另一个外部类访问。它是基于类的,而不是基于对象的安全性。注意:同一外部类中的类可以访问该文件中任何其他类的私有成员。

http://vanillajava.blogspot.co.uk/2012/02/outer-class-local-access.html

于 2012-03-31T10:58:24.383 回答
0

简短的回答是因为这是 Java 定义private访问修饰符的方式。

更长的答案是他们可能认为严格封装仅在源文件级别之上才有意义,因此即使内部类也可以访问其外部类的私有成员(反之亦然):将成员隐藏在同一源中根本没有意义文件。如果您可以访问某个类的源文件,那么无论如何您都可以轻松地修改任何访问修饰符。

(虽然内部-外部类是通过合成访问器实现的,但它们几乎是完全透明的。)

于 2012-03-31T10:58:44.443 回答