封装基本使用

基本介绍

面向对象编程有三大特征:封装、继承和多态。

封装介绍

把抽象出的数据[属性]和对数据的操作[方法]封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作[方法],才能对数据进行操作.

封装的理解和好处

隐藏实现细节:方法(连接数据库) <-- 调用(传入参数…)
可以对数据进行验证,保证安全合理
Person{name,age}
Person p=new Person();
p.name = "liwenhui";
p.age = 1200;

封装的实现步骤 (三步)

将属性进行私有化private [不能直接修改属性并赋值]
提供一个共有的(public)set方法,用于对属性判断并赋值
public void setXxx(类型 参数名){
//Xxx表示某个属性
//加入数据验证的业务逻辑
  属性 = 参数名;
}
提供一个共有的(public)set方法,用于获取属性的值
public 数据类型
getXxx(){
//权限判断 ,Xxx某个属性
  return xx;
}

快速入门案例

在Java中如何实现这种类似的控制呢?
看一个小程序,不能随便查看人的年龄,工资等隐私,并对设置的年龄进行合理的验证,年龄合理就设置,否则给默认年龄,必须在1-120,年龄,工资不能直接查看,name的长度在2-6个字符之间
package p;
public class Encapsulation01 {
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("兮动人");
        person.setAge(1000);
        person.setSalary(30000);
        System.out.println(person.info());
        System.out.println(person.getSalary());
    }
}

class Person {
    public  String name; //名字公开
    private int age; //age 私有化
    private double salary; //..
    public String getName() {
        return name;
    }
    public void setName(String name) {
        //加入对数据的校验,相当于增加了业务逻辑
        if(name.length() >= 2 && name.length() <=6 ) {
            this.name = name;
        }else {
            System.out.println("名字的长度不对,需要(2-6)个字符,默认名字");
            this.name = "无名人";
        }
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        //判断
        if(age >= 1 && age <= 120) {//如果是合理范围
            this.age = age;
        } else {
            System.out.println("你设置年龄不对,需要在 (1-120), 给默认年龄18 ");
            this.age = 18;//给一个默认年龄
        }
    }

    public double getSalary() {
        //可以这里增加对当前对象的权限判断
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
    //写一个方法,返回属性信息
    public String info() {
        return "信息为 name=" + name  + " age=" + age + " 薪水=" + salary;
    }
}

将构造器和 setXxx 结合

在使用构造方法时,也同样可以验证,把 set 方法写到构造器中,在上面的基础上增加如下
//如果我们自己使用构造器指定属性
        Person person1 = new Person("云兮动人", 200, 10000);
        System.out.println("====兮动人的信息====");
        System.out.println(person1.info());

	//有三个属性的构造器
    public Person(String name, int age, double salary) {
       /* this.name = name;
        this.age = age;
        this.salary = salary;*/
        //可以将 set 方法写在构造器当中,这样仍然可以验证
        setName(name);
        setAge(age);
        setSalary(salary);
    }

练习

创建程序,在其中定义两个类: Account和AccountTest类体会Java的封装性.
Account类要求具有属性: 姓名(长度为2位3位或四位),余额(必须>20),密码(必须是六位),如果不满足,则给出提示信息,并给默认值(程序员自己定)
通过setXxx的方法给Account的属性赋值
在AccountTest中测试
提示知识点:
String name = "";
int len = name.length();字符串的长度
public class Account {
    //为了封装,将3个属性设置为private
    private String name;
    private double balance;
    private String pwd;

    //提供两个构造器
    public Account() {
    }

    public Account(String name, double balance, String pwd) {
        this.setName(name);
        this.setBalance(balance);
        this.setPwd(pwd);
    }

    public String getName() {
        return name;
    }

    //姓名(长度为2位3位或4位)
    public void setName(String name) {
        if (name.length() >= 2 && name.length() <= 4) {
            this.name = name;
        } else {
            System.out.println("姓名要求(长度为2位3位或4位),默认值 无名");
            this.name = "无名";
        }
    }

    public double getBalance() {
        return balance;
    }

    //余额(必须>20)
    public void setBalance(double balance) {
        if (balance > 20) {
            this.balance = balance;
        } else {
            System.out.println("余额(必须>20) 默认为0");
        }
    }

    public String getPwd() {
        return pwd;
    }

    //密码(必须是六位)
    public void setPwd(String pwd) {
        if (pwd.length() == 6) {
            this.pwd = pwd;
        } else {
            System.out.println("密码(必须是六位)默认密码为 000000");
            this.pwd = "000000";
        }
    }
    //显示账号信息
    public void showInfo() {
        //可以增加权限的校验
        System.out.println("账号信息 name=" + name + " 余额=" + balance + " 密码" + pwd);
//        if() {
//            System.out.println("账号信息 name=" + name + " 余额=" + balance + " 密码");
//        }else{
//            System.out.println("你无权查看...");
//        }
    }
}
public class TestAccount {
    public static void main(String[] args) {
        //创建Account
        Account account = new Account();
        account.setName("jack");
        account.setBalance(60);
        account.setPwd("123456");

        account.showInfo();
    }
}