以下代码可以完美运行。
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 已在此完成)。
所以,从这个意义上说,应该存在编译器错误。但它并不反对。
现在根据我的理解这是允许的,因为
c1.真正的代码是写在私有类Complex类本身的主体中。
复杂类的开发人员在通过对象引用访问时应该有权访问所有实例成员[无论是私有的,受保护的],因为与任何第三方不同,开发人员非常清楚他在做什么。这就是为什么这里不遵循面向对象模型的原因。
任何人都可以建议更好的解释为什么这里允许 c1.real 代码吗?
private 意味着它不能被其他外部类访问。它是基于类的,而不是基于对象的安全性。 注意:同一外部类中的类可以访问该文件中任何其他类的私有成员。
http://vanillajava.blogspot.co.uk/2012/02/outer-class-local-access.html
简短的回答是,因为这就是 Java 定义
private
访问修饰符的方式。
更长的答案是,他们可能认为严格封装仅在源文件级别之上才有意义,因此即使内部类也可以访问其外部类的私有成员(反之亦然):在同一内部类中隐藏成员根本没有意义源文件。如果您有权访问类的源文件,则无论如何您都可以轻松修改任何访问修饰符。
(虽然内部-外部类的事情是通过合成访问器实现的,但它们几乎是完全透明的。)