java中私有关键字的含义是什么?
下面的代码运行得非常好java中私有关键字的含义是什么?,java,compiler-construction,jvm,private-members,object-oriented-analysis,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 toS
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.real代码吗?private表示不能从其他外部类访问它。它是基于类的,而不是基于对象的安全性。注意:同一外部类中的类可以访问该文件中任何其他类的私有成员
private表示不能从其他外部类访问它。它是基于类的,而不是基于对象的安全性。注意:同一外部类中的类可以访问该文件中任何其他类的私有成员
简单的回答是,因为Java就是这样定义
private
access修饰符的
更长的答案是,他们可能认为严格封装只在源文件级别以上才有意义,因此即使是内部类也可以访问其外部类的私有成员(反之亦然):在同一源文件中隐藏成员根本没有意义。如果您已经获得了对类的源文件的访问权,那么您仍然可以轻松地修改任何访问修饰符
(虽然内部和外部类是通过合成访问器实现的,但它们几乎是完全透明的。)简单的回答是,因为Java就是这样定义
私有访问修饰符的
更长的答案是,他们可能认为严格封装只在源文件级别以上才有意义,因此即使是内部类也可以访问其外部类的私有成员(反之亦然):在同一源文件中隐藏成员根本没有意义。如果您已经获得了对类的源文件的访问权,那么您仍然可以轻松地修改任何访问修饰符
(虽然内部-外部类是通过合成访问器实现的,但它们几乎是完全透明的。)“私有实例成员不能通过对象引用进行访问”-这从何而来?私有/受保护的概念是对外部世界隐藏内部。一个班级了解自己并没有什么错。毕竟,这是同一类人。这种误解从何而来在面向对象的设计模型中,私有实例成员不能通过对象引用“+1”来访问,这是一个措辞恰当的问题。“私有实例成员不能通过对象引用来访问”-这是从哪里来的?私有/受保护的思想是对外部世界隐藏内部。一个班级了解自己并没有什么错。毕竟,这是同一类人。这种误解从何而来面向对象设计模型,私有实例成员不能通过对象引用“+1”访问,因为该对象引用的问题措辞恰当。包p;公共类PTest{PTest(){int b=new V().testMe;//虽然在同一个文件中定义,但不允许。}}类V{private int testMe=5;}这不完全正确。它应该是“在外部类中定义的内部类可以访问在外部类中定义的任何其他类的私有成员”。在同一文件中声明的两个外部类不能访问彼此的私有成员。@Dunes是的。这是真的。但我不打算讨论内部类。实际上Peter说过“注意:同一文件中的类可以访问该文件中任何其他类的私有成员。”。但这不可能发生。对吗?是的,Peter,您必须指定一点。有趣的是,内部类不仅可以访问外部类的私有成员(众所周知)但也包括其他内部类的私有成员。因此,基本上,类定义的开始括号和结束括号之间的任何内容都可以访问私有成员。听起来不太快,但我认为是正确的:)包p;公共类PTest{PTest(){int b=new V().testMe;//尽管在同一文件中定义,但不允许。}class V{private int testMe=5;}这不完全正确。它应该是“外部类中定义的内部类可以访问外部类中定义的任何其他类的私有成员。“同一文件中声明的两个外部类不能访问彼此的私有成员。@Dunes是的。这是真的。但我不打算讨论内部类。事实上Peter说:“注意:同一文件中的类可以访问该文件中任何其他类的私有成员。”.但这不可能发生。对吗?是的,彼得,你必须指定一点。有趣的是,足够多的内部类不仅可以访问外部类(众所周知)的私有成员但也包括其他内部类的私有成员。因此,基本上,类定义的开始括号和结束括号之间的任何内容都可以访问私有成员。听起来不太快,但我认为是正确的:)