首先我们看一个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对象表示一个用户,用户的年龄不可能为负数,而程序此时并不会报错,这是当前程序所缺陷的。

面向对象包括三大特征:
封装、继承与多态。

为什么要封装?封装有什么好处?
封装的好处:

  • 封装之后,对于那个事物来说,看不到这个事物比较复杂的那一面,只能看到该事物简单的那一面。复杂性封装,对外提供简单的操作入口。就像电视机,它的内部实现非常复杂,但是对于使用者来说不需要关心内部实现原理,只需要会操作遥控器就可以。
  • 封装之后才会有真正的对象,真正的独立体。
  • 封装就意味着以后的程序可以重复使用。并且这个事物应该适应性很强,任何场合都适用。
  • 封装之后,对于事物本身,提高了安全性。

封装的步骤:

  1. 所有属性私有化,使用private关键字进行修饰,表私有,修饰的所有数据只能在本类中访问
  2. 对外提供简单的操作入口,也就是说以后外部程序要想访问age属性,必须通过这些简单的入口进行访问:
    一个属性通常访问的时候包括两种访问方式:读取属性的值(get)、修改属性的值(set)
    对外提供两个公开的方法,分别是set和get方法:
    想修改age属性,调用set方法
    想修改age属性,调用get方法
  3. set方法命名规范:
    public void setAge(int a){
    age=a;
    }
  4. 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的年龄便会不会输出,告知不合法了。