赞
赏
封装性是面向对象的第一大特性,所谓的封装性就是指属性对外部不可见。外部不能够随意修改内部数据,保护类里面的属性安全。
/**
* 定义一个 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();
}
}
运行结果如下:
我们看到了 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();
}
}
使用封装编译报错如下:
因为 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();
}
}
运行结果如下:
我们可以看到和上面直接访问属性的时候的运行结果一样,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。运行结果如下:
封装性,在一定程度上面保证了对象创建的时候属性的安全性,不会将属性暴露出来给别的类随便访问,我们用 private 对属性进行限制,然后用 public 修饰的 get 和 set 方法来对属进行操作。这样别的对象在操作属性的时候,通过调用对属性操作的方法就可以完成。