【问题标题】:What are the implications of private keyword in java?java中private关键字的含义是什么?
【发布时间】:2012-03-31 10:54:27
【问题描述】:

以下代码可以完美运行。

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 代码?

【问题讨论】:

  • “不能通过对象引用访问私有实例成员”——这是从哪里来的?
  • private/protected 的想法是对外界隐藏内部。一个类知道它自己并没有错。毕竟是同一个班级。
  • 这种误解从何而来? => '面向对象的设计模型,不能通过对象引用访问私有实例成员'
  • +1 表示一个措辞良好的问题。

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


【解决方案1】:

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

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

【讨论】:

  • 包装 p;公共类 PTest{ PTest(){ int b=new V().testMe; //虽然在同一个文件中定义,但不允许。 } } 类 V{ 私有 int testMe=5; }
  • 这并不完全正确。它应该读作“在外部类中定义的内部类可以访问在外部类中定义的任何其他类的私有成员”。在同一个文件中声明的两个外部类不能访问彼此的私有成员。
  • @Dunes 是的。没错。但我不会进入内部类讨论。实际上彼得说“注意:同一文件中的类可以访问该文件中任何其他类的私有成员。 ”。但这不可能发生。对吧?
  • 是的,彼得你必须指定一点。有趣的是,内部类不仅可以访问外部类的私有成员(众所周知),还可以访问其他内部类的私有成员。所以基本上类定义的左大括号和右大括号之间的任何东西都可以访问私有成员。听起来不时髦,但我认为是正确的:)
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-09-13
    • 1970-01-01
    • 2018-05-05
    • 2020-04-25
    • 2015-05-16
    • 2019-07-20
    • 2014-11-29
    • 2022-01-18
    • 2015-07-28
    相关资源
    最近更新 更多