点表示法如何更改对象的内部表示形式?

时间:2018-07-24 12:00:39

标签: oop

我是面向对象编程的新手。我遇到了Getter和Setters的概念以及点表示法来操纵对象的值。建议使用更多的Getters和Setters方法代替点表示法。 我试图了解其背后的原因,并发现使用点符号可能会更改对象的内部表示形式。但是,我所引用的资源并没有告诉我们这种变化是如何发生的。

有人可以说出这种变化的实际情况吗?

提前谢谢!

1 个答案:

答案 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;
    }
}

总而言之,我们这样做是因为封装使代码更干净,更可预测且更可维护。我希望这会有所帮助!