首先我们看一个User类和UserTest类:
public class User {
// 用户类
int age;
}
// 用户测试类
public class UserTest {
public static void main(String[] args) {
//创建User对象
User user=new User();
//访问age
//读取年龄值
System.out.println("该用户年龄"+user.age);
//修改年龄值
user.age=20;
//读取年龄值
System.out.println("该用户年龄"+user.age);
user.age=-100;
System.out.println("该用户年龄"+user.age);
//这里的age属性完全暴露给外部程序,对于程序员来说可以操作User对象当中所有细节,
//导致User程序中部分属性不安全
}
}
对于当前的程序来说:
- User类当中的age属性在外部程序可以随意访问,导致age属性的不安全
- 一个User对象表示一个用户,用户的年龄不可能为负数,而程序此时并不会报错,这是当前程序所缺陷的。
面向对象包括三大特征:
封装、继承与多态。
为什么要封装?封装有什么好处?
封装的好处:
- 封装之后,对于那个事物来说,看不到这个事物比较复杂的那一面,只能看到该事物简单的那一面。复杂性封装,对外提供简单的操作入口。就像电视机,它的内部实现非常复杂,但是对于使用者来说不需要关心内部实现原理,只需要会操作遥控器就可以。
- 封装之后才会有真正的对象,真正的独立体。
- 封装就意味着以后的程序可以重复使用。并且这个事物应该适应性很强,任何场合都适用。
- 封装之后,对于事物本身,提高了安全性。
封装的步骤:
- 所有属性私有化,使用private关键字进行修饰,表私有,修饰的所有数据只能在本类中访问
- 对外提供简单的操作入口,也就是说以后外部程序要想访问age属性,必须通过这些简单的入口进行访问:
一个属性通常访问的时候包括两种访问方式:读取属性的值(get)、修改属性的值(set)
对外提供两个公开的方法,分别是set和get方法:
想修改age属性,调用set方法
想修改age属性,调用get方法 - set方法命名规范:
public void setAge(int a){
age=a;
} - get方法命名规范:
public int getAge(){
return age;
}
于是用户类我们把它改成:
public class User {
// 用户类
//属性私有化
private int age;
public void setAge(int a) {
age=a;
}
public int getAge() {
return age;
}
}
UserTest类改成:
public class UserTest {
public static void main(String[] args) {
//创建User对象
User user=new User();
//编译报错,age属性私有化,在外部程序中不能直接访问
//对目前程序来说,age属性彻底在外部访问不到了
//System.out.println(user.age);
//修改
user.setAge(-100);
//读取
user.getAge();
System.out.println(user.getAge());
}
}
然鹅,此时-100的年龄仍然可以运行。
我们不妨在setAge方法当中编写逻辑代码进行安全控制。
public class User {
// 用户类
//属性私有化
private int age;
public void setAge(int a) {
if(a<0||a>120) {
System.out.println("对不起,年龄不合法");
return;
}
age=a;
}
public int getAge() {
return age;
}
}
此时,-100的年龄便会不会输出,告知不合法了。