Java语言封装性

封装性教程

封装性是面向对象的第一大特性,所谓的封装性就是指属性对外部不可见。外部不能够随意修改内部数据,保护类里面的属性安全。

封装性案例

没有使用封装代码

/** * 定义一个 person 类 */ package com.haicoder.net.clas; public class Person { String name; int age; public void desc() { System.out.println("姓名 : " + name + ", 年龄 : " + age); } }

定义一个访问 Person 类创建的对象的访问类

/** * 用来创建对象,并使用的测试类 */ package com.haicoder.net.clas; public class TestPerson { public static void main(String[] args) { System.out.println("嗨客网(www.haicoder.net)"); Person person = new Person(); person.name = "嗨客网"; person.age = 200; person.desc(); } }

运行结果如下:

09 没有用封装的例子.png

我们看到了 Person 里面的名字和年龄是可以随便赋值的,随便访问的。一个人对年龄 200 岁,在实际世界里面是比较荒谬的。其实这个在面向对象里面是不允许的。所以为了避免这样的情况发生,在真实的开发场景里面,会给类里面的属性加上 private 关键字修饰。这个就会将类里面的属性的 访问权限 给控制住。

使用封装代码

package com.haicoder.net.clas; /** * 定义一个 person 类 */ public class Person { private String name; private int age; public void desc() { System.out.println("姓名 : " + name + ", 年龄 : " + age); } }

定义一个访问 Person 类的测试类:

package com.haicoder.net.clas; /** * 用来创建对象,并使用的测试类 */ public class TestPerson { public static void main(String[] args) { System.out.println("嗨客网(www.haicoder.net)"); Person person = new Person(); person.name = "嗨客网"; //编译不通过,报错 person.age = 200; //编译不通过,报错 person.desc(); } }

使用封装编译报错如下:

10 使用封装报错.png

因为 person 里面的属性加了 private 权限,所以不能够直接访问了,也不能够对 person 里面的属性随便赋值。被 private 关键字修饰的属性,只能够在当前类里面访问,出了当前类是不能够被访问的。

封装属性

在上面,我们对类里面的属性加类 private 修饰,那么怎么对这些属性进行操作呢?在实际的编程过程中,我们会用 get 和 set 方法,来对类里面的属性进行访问和操作。

package com.haicoder.net.clas; /** * 定义一个 person 类 */ public class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void desc() { System.out.println("姓名 : " + name + ", 年龄 : " + age); } }

定义一个调用上面对象的测试类

package com.haicoder.net.clas; /** * 用来创建对象,并使用的测试类 */ public class TestPerson { public static void main(String[] args) { System.out.println("嗨客网(www.haicoder.net)"); Person person = new Person(); person.setName("嗨客网"); person.setAge(200); person.desc(); } }

运行结果如下:

11 正确使用封装方法.png

我们可以看到和上面直接访问属性的时候的运行结果一样,age 的年龄是 200,在实际生活中是不合理的,但是既然是调用的 setAge 方法来赋值,我们可以在这个方法里面来做限制。

package com.haicoder.net.clas; /** * 定义一个 person 类 */ public class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { if (age < 0 || age > 150) { this.age = 0; } else { this.age = age; } } public void desc() { System.out.println("姓名 : " + name + ", 年龄 : " + age); } }

我们看到,在调用 setAge 方法的时候,我们会先对 age 的数值进行比较,如果不符合真实场景了,我们就设置为 0。运行结果如下:

12 封装 set 方法.png

Java封装性总结

封装性,在一定程度上面保证了对象创建的时候属性的安全性,不会将属性暴露出来给别的类随便访问,我们用 private 对属性进行限制,然后用 public 修饰的 get 和 set 方法来对属进行操作。这样别的对象在操作属性的时候,通过调用对属性操作的方法就可以完成。