先定义一个用户类
package com.lbj.javase;
/*
* 用户类
*
*/
public class User {
//年龄
public int age;
}
再定义一个测试类,来感受一下什么是封装,到底为什么要封装?
package com.lbj.javase;
/**
* 用户测试类
* @author 14811
* 对于当前程序来说:User类中的age属性在外部程序中可以随意访问,导致age属性的不安全
* 以下程序中年龄值为负数,程序运行时没有报错,这是当前程序存在的缺陷
*
* 当前主讲封装机制。为什么要封装?封装有何好处?
*
* 1.封装后,对于指定事物来说,看不到事物比较复杂的一面,只能看到事物简单的一面
*
* 2.封装之后才会形成真正的对象,真正的独立体
*
* 3.封装意味着程序可以重复使用,在任何场景都可以使用
*
* 4.封装只提供简单的操作入口,提高了安全性
*
*
*/
public class UserTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建User对象
User user=new User();
//访问age
//读取年龄值【get】
System.out.println("用户年龄:"+user.age);
//修改年龄值
//这里的age属性完全暴露给外部程序,对于程序员来说可以操作User对象中的所有细节【数据不安全】
//不建议这样,建议User类型进行封装,建议在外部程序中不能随意访问User对象中的属性,这样可以保证属性的安全
user.age=10;
//访问age
//读取年龄值【get】
System.out.println("用户年龄:"+user.age);
user.age=-10;
System.out.println("用户年龄:"+user.age);
}
}
再重新创建一个包,包里面新建一个用户类
package com.lbj.javase02;
/**
*
* @author 14811
*封装步骤:
* 1.所有属性私有化,使用private关键字进行修饰,private表示私有的,修饰的所有数据只能在本类中访问。
*
* 2.对外提供简单的操作入口,也就是说以后外部程序想要访问age属性,必须通过这些简单的入口进行访问
* -对外提供两个公开的方法,分别是set方法和get方法
* -想修改age属性,调用set方法
* -想读取age属性,调用get方法
*
* 3.set方法的命名规范:
* public void setAge(int a){//set+首字母大写
* age=a;
* {
*
* 4.get方法的命名规范:
* public int getAge(){//get+首字母大写
* return age
* {
* 5.setter and getter 方法没有static关键字
* 有static关键字修饰的方法怎么调用:类名.方法名(实参);
* 没有static关键字修饰的方法怎么调用:引用.方法名(实参);
*
*
*/
public class User {
//私有化定义的年龄age,外类不允许访问
private int age;
//set方法没有返回值,因为set方法只负责修改数据
/*
public void setAge(int age){
age=age;//java有就近原则,这里其实并没有给age属性赋值,因为这里的age都是局部变量
}//报错
//接下来迟一点会介绍this关键字的用法,就会明白这里的道理了
*/
//setter
public void setAge(int a){
//编写业务逻辑代码进行安全控制
//age=a;
//如果说传过来的年龄不符合实际要求就不可以传进来并提示错误信息实现安全控制
if(a<0||a>150){
System.out.println("对不起,您提供的年龄不合法");
return;
}
//如果程序执行到这里的话,说明a年龄是合法的,则进行赋值运算
age=a;
}
//getter
public int getAge(){
return age;
}
}
新建一个测试类,这就是封装:
package com.lbj.javase02;
public class UserTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建User对象
User user=new User();
//编译报错,age属性私有化private,在外部程序中不能直接访问
//从此之后age属性非常安全,但是有点太安全了,对于外部的私有类彻底访问不到
//System.out.println(user.age);
user.setAge(10);
System.out.println(user.getAge());
//私有属性不能在外部直接访问,因此需要封装访问
//user.age;
}
}