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