我是面向对象编程的新手。我遇到了Getter和Setters的概念以及点表示法来操纵对象的值。建议使用更多的Getters和Setters方法代替点表示法。 我试图了解其背后的原因,并发现使用点符号可能会更改对象的内部表示形式。但是,我所引用的资源并没有告诉我们这种变化是如何发生的。
有人可以说出这种变化的实际情况吗?
提前谢谢!
答案 0 :(得分:2)
使用getter和setter(或某些语言中的属性)是常见的做法,因为它们会促进封装four principles of object oriented programming之一。这个想法是,一个对象应该控制自己的属性或成员,而外部类则不能直接操纵其属性或成员。
您专门询问了对象的内部表示形式。例如,当您调用get函数时,Java为passes its members by value,但是您使用点符号直接访问成员。例如,上以下课程:
public class Person {
public String name = "John";
public String getName() {
return name;
}
}
在这种情况下,您可以通过name
方法访问Person
类的getName()
成员,也可以通过点表示法来访问它。如果您使用getName()
方法,那么您将不会无意中更改name
成员的值。例如:
public static void main(String[] args) {
Person person = new Person();
String name = person.getName();
name = "Gary";
Sysetm.out.println(person.getName());
}
将产生输出John
,而输出如下:
public static void main(String[] args) {
Person person = new Person();
person.name = "Gary";
Sysetm.out.println(person.getName());
}
将产生输出Gary
。
处理此person类的公认做法是使用封装,并为其成员设置私有访问修饰符,如下所示:
public class Person {
private String name = "John";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
现在,您可以使用setName
方法将名称成员显式设置为所需的名称,但是您将永远无法使用点符号无意中更改名称成员。
此外,通常在您返回成员或设置成员之前,您有时想对成员执行某些操作。一个简单的示例如下:
public class Person {
private String name = "John";
public String getName() {
return name;
}
public void setName(String name) {
// null values are not allowed, and a name must be at least two characters long
if (name == null || name.length() < 2) {
return;
}
// name must be capitalzed
name = name.substring(0, 1).toUpperCase() + name.substring(1).toLowerCase();
this.name = name;
}
}
总而言之,我们这样做是因为封装使代码更干净,更可预测且更可维护。我希望这会有所帮助!