为什么 Java 中的实例变量始终是私有的?
我是Java的新手,我正在学习封装,并看到了一个示例,其中实例变量在类中被声明为私有。
http://www.tutorialspoint.com/java/java_encapsulation.htm
我有2个查询:
- 为什么实例变量是私有的?为什么不公开?
- 如果实例变量公开并直接访问,该怎么办?我们是否看到任何限制?
您能用一个例子来解释一下,如果实例变量在Java中的类中被声明为公共,会有什么问题吗?
我是Java的新手,我正在学习封装,并看到了一个示例,其中实例变量在类中被声明为私有。
http://www.tutorialspoint.com/java/java_encapsulation.htm
我有2个查询:
您能用一个例子来解释一下,如果实例变量在Java中的类中被声明为公共,会有什么问题吗?
实例变量被设为私有,以强制这些类的用户使用方法来访问它们。在大多数情况下,有普通的 getter 和 setter,但也可以使用其他方法。
例如,使用方法将允许您将访问限制为只读,即如果没有 setter,则字段可能被读取但未写入。如果该领域是公开的,这是不可能的。
此外,您可以为字段访问添加一些检查或转换,而这对于公共字段的普通访问是不可能的。如果一个字段是公共的,并且您以后希望通过执行其他检查等的某种方法来强制所有访问。您必须更改该字段的所有用法。如果将其设为私有,则稍后只需更改访问方法即可。
如果电话
是私人的:
请考虑以下情况:
class Address {
private String phone;
public void setPhone(String phone) {
this.phone = phone;
}
}
//access:
Address a = new Address();
a.setPhone("001-555-12345");
如果我们从这样的类开始,后来需要对电话号码执行检查(例如,一些最小长度,仅数字等),您只需要更改设置符:
class Address {
private String phone;
public void setPhone(String phone) {
if( !isValid( phone) ) { //the checks are performed in the isValid(...) method
throw new IllegalArgumentException("please set a valid phone number");
}
this.phone = phone;
}
}
//access:
Address a = new Address();
a.setPhone("001-555-12345"); //access is the same
如果电话
是公开的:
有人可以这样设置,而你对此无能为力:phone
Address a = new Address();
a.phone="001-555-12345";
如果您现在想要强制执行验证检查,则必须将其设为私有,并且编写上述行的人都必须将第二行更改为:
a.setPhone("001-555-12345");
因此,您不能在不破坏其他代码的情况下添加检查(它不再编译)。
此外,如果通过方法访问类的所有字段/属性,则可以保持访问一致性,用户不必担心属性是存储的(即是实例字段)还是计算的(只有方法而没有实例字段)。
他们不必是私人的 - 但他们应该是。字段是实现细节 - 因此应将其保密。如果你想允许用户获取或设置其值,你可以使用属性来执行此操作(get和set方法) - 这可以让你安全地做到这一点(例如验证输入),还允许您更改实现细节(例如,将一些值委托给其他对象等),而不会失去向后兼容性。