← 返回首页
JavaSE系列教程(二十四)
发表时间:2020-01-01 19:38:18
讲解什么封装?如何理解封装?

封装(Encapsulation)是面向对象方法的重要原则,就是把对象的属性和方法(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。所以说类就是一个封装体,封装了属性和方法。

封装的好处: 1)隐藏实现细节。 2)可以对成员变量进行更精确的控制,提高了安全性。

1.为什么要封装

请看以下代码:

public class Person {
    String name;
    String gender;
    int age;

    Person(){
        System.out.println("一个人从世界上诞生了...");
    }

    public Person(String name, String gender, int age) {
        this();
        this.name = name;
        this.gender = gender;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                ", age=" + age +
                '}';
    }
}

public class Test {

    public static void main(String[] args) {
        Person p1 = new Person("张三","男",18);

        p1.gender = "女"; //外部类可以随意修改一个人的性别,有悖常理。

        System.out.println(p1);

        Person p2 = new Person("翠花","女",38);//年龄是女人的秘密,可以随意获取真实年龄吗?
        System.out.println(p2.age);


    }
}
运行结果:
一个人从世界上诞生了...
Person{name='张三', gender='女', age=18}
一个人从世界上诞生了...
38

在上例中,人出生后性别一般的不会发生改变的,所有性别属性应该只能读取,不能修改。年龄是女人的秘密,所有你获取到的永远不是女人的真实年龄。如何才能做到以上功能呢?我们需要对属性进行封装。

2.如何封装

Person类改下为如下效果:

public class Person {

    private String name;
    private String gender;
    private int age;

    Person(){
        System.out.println("一个人从世界上诞生了...");
    }

    public Person(String name, String gender, int age) {
        this();
        this.name = name;
        this.gender = gender;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }


    public int getAge() {
        if("女".equals(this.gender)){
            return 18;
        }
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + this.getName() + '\'' +
                ", gender='" + this.getGender() + '\'' +
                ", age=" + this.getAge() +
                '}';
    }
}

public class Test {

    public static void main(String[] args) {
        Person p1 = new Person("张三","男",18);

        //p1.gender = "女"; //性别属性是只读的,不允许直接修改。

        System.out.println(p1);

        Person p2 = new Person("翠花","女",38);
        System.out.println(p2.getAge()); //返回了不真实的年龄,隐藏实现的细节。


    }
}
运行结果:
一个人从世界上诞生了...
Person{name='张三', gender='男', age=18}
一个人从世界上诞生了...
18

小结: