简短的回答是“不是真的”。数据仍然在内存中,如果你用反射四处挖掘,你可以得到字段的内容。将字段和方法标记为私有是一种与其他程序员交流的方式:“嘿,这是类的内部工作,它容易发生变化,请不要碰它。”
您可以使用以下命令获取私有字段的值:
// suppose we have a class
Person person = new Person("John");
// Field is from java.lang.reflect.Field
Field nameField = Person.class.getDeclaredField("name");
// tell Java to ignore the private modifier
nameField.setAccessible(true);
// now you can "steal" the private field
System.out.println(nameField.get(person));
除非绝对必要,否则请不要使用这是您的代码,如果您使用反射,请格外小心。
此外,即使语言设计无法访问该字段,如果我们谈论的是安全性,例如在扫描内存的外部程序中,将字段标记为私有并不会隐藏数据。毕竟…数据必须在某个地方,对吧?
这就是oops中封装的原理,也就是信息隐藏。你可以使用访问修饰符来定义类、方法和属性的可见性。
您可以通过使您的类属性无法从外部访问以及为其他类可读或可更新的属性提供getter和/或setter方法来实现这种信息隐藏机制。