示例:学生类(名称,年龄)。在没有封装对name和age的访问时所带来的问题。
package bu18;
publicclass Test2 {
publicstaticvoid main(String[] args){
Student stu1 = new Student();
stu1.name = "张三";
stu1.age = -20;
System.out.println(stu1.name);
System.out.println(stu1.age);
}
}
class Student{
public String name;
publicintage;
}
输出:年龄小于零,不合乎逻辑。但是程序运行却是正常的,并没有报错。所以通过“.”直接访问成员变量的做法是不对的。
改进(规范):
1、 所有成员变量设置为private
2、 所有成员变量添加getter和setter方法。通常方法都是public的。
3、 在setter中设置成员的值,而在getter方法只是作单纯的显示功能。
原则:所有的赋值语句都在set方法中,而get方法只是简单地返回值。
class Student{
private String name;
privateintage;
publicint getAge() {
returnage;
}
publicvoid setAge(int age) {
if(age<0 ||age>150){
System.out.println("日志:输入年龄不合法。"+age);
age = 18;//学生默认18岁
}
this.age = age;
}
public String getName() {
returnname;
}
publicvoid setName(String name) {
this.name = name;
}
}
封装总结:
1、 减少代码冗余,提高重用性
2、 提供一种访问机制,让使用者不能直接访问成员变量(常言道:通过公有方法来访问私有变量)。
3、 降低使用难度,使代码使用更为简单。
思考:在get方法中写,还是在set方法中写?