引例:
// 用户类
public class User {
//年龄
int age;
}
/*
用户测试类
*/
public class UserTest {
public static void main(String[] args) {
User u = new User();
int age = -100;
System.out.println("用户的年龄是: " + u.age); //-100
}
}
对当前程序来说:
User 类中的age属性在外部程序中可以随意访问,导致age属性不安全。
一个User对象表示一个用户,用户的年龄不可能为复数,以下程序中年龄之值为复数,程序运行时没有报错,这是程序存在的缺陷
面向对象包括三大特征:
—封装
—继承
—多态
*为什么要封装?
封装的好处:
1、封装之后,对于那个事物来说,看不到这个事物比较复杂的那一面,只能看到该事务简单的那一面。复杂性封装,对外提供简单的操作入口(例: 照相机)。
2、封装之后才会形成真正的“ 对象 ”,真正的“ 独立体 ”。
3、封装就意味着以后的程序可以重复使用,并且这个事物的适应性比较强,在任何场合都可以使用。
4、封装之后对于事物本事提高了安全性。
对于上述User程序来说,建议对User类型进行封装,在外部程序中不能随意访问User对象当中的属性。这样可以保证属性的安全。
封装的步骤:
1.所有属性私有化,使用private关键字进行修饰,private 表示私有的,修饰的所有数据只能在本类中访问。
// 用户类
public class User {
//属性私有化
private int age;
}
/*
用户测试类
*/
public class UserTest {
public static void main(String[] args) {
User u = new User();
//编译错误
int age = -100;
//编译错误
System.out.println("用户的年龄是: " + u.age);
}
/* 其中 " int age = -100; "以及后面"syso"输出编译报错,age属性私有化,在外部程序中不能直接访问,从此之后age属性非常安全,但有点太安全了。对于目前外部程序来说age彻底访问不到了。 */
2、对外提供简单的操作入口,也就是说以后外部程序要想访问age属性,必须通过这些简单的入口进行访问。
# 对外提供两个公开的方法,分别是set方法和get方法
-想修改age属性,调用set方法
-想读取age属性,调用get方法
3.set方法命名规范:
public void set + 属性名首字母大写 (形参) {
}
//* 例 *
public void setAge (int a){
age = a;
}
4.get方法命名规范:
public 返回值类型 get + 属性名首字母大写 () {
return 返回值;
}
public int getAge () {
return age;
}
回想一下,一个属性通常访问的时候包括几种形式?
— 第一种方式:想读取这个属性的值,读取get
— 第二种方式:想修改这个属性的值,修改set
【注】:
setter and getter 方法没有static关键字
— 有static修饰的方法如何调用:类名.方法名(实参);
— 没有static修饰的方法如何调用: 引用.方法名 (实参);
#修改后结果:#
//用户类
public class User {
//属性私有化
private int age;
//set方法没有返回值因为set方法只负责修改数据
//setter
public void setAge(int a) {
//可以编写业务逻辑语句进行安全控制
if(a<0 || a>150) {
System.out.println("对不起,您提供的年龄不合法。");
return;
}
//程序能进行到这里的话,说明a年龄合法,则进行赋值运算。
age = a;
}
//getter
public int getAge() {
return age;
}
}
//测试类
public class Test {
public static void main(String[] args) {
//创建对象
User u = new User();
//修改 引用.方法名(实参);
u.setAge(-100);
//读取
System.out.println(u.getAge()); //0
}
}
一个属性要有setter and getter,但在eclipse/myeclipse中可帮助我们自动编写setter and getter。
在空白处右键选中Source - - - > Generate Getters and Setters…
(Alt + shift + S快捷键)
点击全选
自动生成setter and getter:
整体情况变为:
public class CustomerTest {
public static void main(String[] args) {
Customer c = new Customer();
c.setId(100);
c.setName("张三");
c.setAge(18);
c.setAddr("河南郑州");
System.out.println(c.getId());
System.out.println(c.getName());
System.out.println(c.getAge());
System.out.println(c.getAddr());
}
}
私有属性不能再外部直接访问,这就是封装
// c.id = 410 编译报错
操作入口变为setter and getter进行访问
在set方法和get方法执行过程中可以进行安全过滤