私有关键字在java中有什么含义?

时间:2012-03-31 10:54:28

标签: java compiler-construction jvm private-members object-oriented-analysis

以下代码适用&运行得很好。

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类的开发人员应该可以访问所有实例成员[无论是私有的,受保护的],因为开发人员非常清楚他在做什么,不像任何第三方。这就是为什么没有遵循面向对象的模型模型的原因。

  3. 有人可以建议更好地解释为什么允许使用c1.real代码吗?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

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

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

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