Skip to content

封装(encapsulation)


面向对象三大特征

(1)封装

(2)继承

(3)多态

基本介绍

封装(encapsulation)就是把抽象出的数据属性和对数据的操作方法封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作方法,才能对数据进行操作。

封装的优势

(1)隐藏实现细节,直接调用方法

(2)可以对数据进行验证,保证安全合理

封装步骤

(1)使用 private 修饰符(不能直接修改属性),将属性进行私有化

(2)提供一个 public(公共的)set 方法,用于对属性判断并赋值

java
public void setxxx(类型,参数名) { //  xx 表示某个属性

    // 加入数据验证的业务逻辑
    属性 = 参数名;
}

(3)提供一个 public(公共的)get 方法,用于获取属性的值

java
public void getxxx() { // 权限判断 xx 表示某个属性
  return xx;
}

⭐ 生成默认的 setter 和 getter 方法

快捷键:alt + insert

案例一

定义一个 person 类,要求不能随便查看人的年龄,工资这两个隐私,并对设置的年龄进行合理的验证,年龄合理就是设置,否则给默认年龄,必须在 1 - 120 岁之间,工资不能随便查看

java
package encapsulation;

import java.util.Scanner;

public class test1 {
    public static void main(String[] args) {

        person p = new person();
        p.setName("jacskon");
        p.setAge(18);
        p.setSalary(10000);
        p.getSalary();
        p.getinfo();

        // 使用构造器初始化测试
        person p1 = new person("1234567",0,1);
        p1.getinfo();
    }
}

class person {

    // 定义属性
    public String name;
    private int age;
    private double salary;

    // 声明无参构造器
    public person() {

    }

    // 声明初始化属性的构造器
    public person(String name, int age, double salary) {

        // 为了防止使用构造器初始化然而绕过了业务逻辑的判断,在构造器里调用方法
        setName(name);
        setAge(age);
        setSalary(salary);
    }

    // 使用快捷键 alt + insert 生成 getter,setter ;按住 ctrl / shift 实现多选

    public String getName() {
        return name;
    }

    public void setName(String name) {
        if (name.length() >= 2 && name.length() <= 6) {
            this.name = name;
        } else {
            System.out.println("你输入的名字:" + name +"不合理\n提醒:名字长度需要在2-6个字符之间,给你默认姓名---用户01");
            this.name = "用户01";
        }

    }


    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age >= 1 && age <= 120) {
            this.age = age;
        } else {
            System.out.println("你的年龄不合理,给你默认年龄----18");
            this.age = 18;
        }

    }


    public double getSalary() {
        int cnt = 1;
        while(true){
            System.out.println();
            System.out.println("这是第" + cnt + "次身份验证");
            System.out.print("输入密码验证身份:");
            Scanner input = new Scanner(System.in);
            String password = input.next();
            if (password.equals("123")) {
                System.out.println();
                System.out.println("身份验证通过~~");
                System.out.println("您的薪水是:" + salary);
                break;
            } else {
                System.out.println();
                System.out.print("身份验证失败,重新输入密码");
                System.out.println();
                cnt += 1;
            }
            if(cnt == 4){
                System.out.println("三次密码错误,身份验证失败,账户锁定!");
                break;
            }
        }
        return 0;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    // 写一个方法返回所有信息
    public void getinfo() {
        System.out.println();
        System.out.println("=====个人信息如下=====");
        System.out.println("姓名:" + name);
        System.out.println("年龄:" + age);
        System.out.println("工资:" + salary);
    }
}

// 输出结果

你输入的名字:jacskon不合理
提醒:名字长度需要在2-6个字符之间,给你默认姓名---用户01

这是第1次身份验证
输入密码验证身份:123

身份验证通过~~
您的薪水是:10000.0

=====个人信息如下=====
姓名:用户01
年龄:18
工资:10000.0
你输入的名字:1234567不合理
提醒:名字长度需要在2-6个字符之间,给你默认姓名---用户01
你的年龄不合理,给你默认年龄----18

=====个人信息如下=====
姓名:用户01
年龄:18
工资:1.0

案例二

创建程序,在其中定义两个类:Account 和 AccountTest 类会封装 Java 的封装性。

1. Account 类要求具有以下属性:

(1)姓名(长度为 2 至 3 位或 4 位)

(2)余额(必须>20)

(3)密码(必须是六位,如果不足,则给出提示信息,并给默认值【程序员自己定】)

2. 通过 setXxx 的方法给 Account 的属性赋值。

3. 在 AccountTest 中测试。

java
package encapsulation;

import java.util.Scanner;

public class test2 {
    public static void main(String[] args) {
        accounttest test = new accounttest();
        test.init();

        System.out.println("\n");

        System.out.println("=====这里是acoount传入数据的返回结果");
        account test1 = new account();
        test1.setName("jackson");
        test1.setBalance(10);
        test1.setPassword("123");
        test1.getinfo();
    }
}

class account {
    String name;
    double balance;
    String password;

    // 声明无参构造器
    public account() {

    }

    // 构造器
    public account(String name, double balance, String password) {
        setName(name);
        setBalance(balance);
        setPassword(password);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        if (name.length() >= 2 && name.length() <= 4) {
            this.name = name;
        } else {
            System.out.println("输入的名字长度应在2-4个字符,给你默认姓名:01");
            this.name = "01";
        }
    }

    public double getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        if (balance >= 20) {
            this.balance = balance;
        } else {
            System.out.println("余额不足20,默认余额设为0");
        }

    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        while (true) {
            if (password.length() == 6) {
                System.out.println("密码设置成功~~");
                this.password = password;
                break;
            } else {
                System.out.print("密码长度需要六位,请重新输入:");
                Scanner input = new Scanner(System.in);
                password = input.next();
                System.out.println();
            }
        }
    }

    public void getinfo(){
        System.out.print("名字:" + name + "\n余额:" + balance + "\n密码:" + password);
    }
}

class accounttest {
    public void init(){
        System.out.println("====这里是accounttest传入数据的返回结果");
        account person = new account();
        person.setName("jack");
        person.setBalance(25);
        person.setPassword("123456");
        person.getinfo();
    }
}

// 输出结果
====这里是accounttest传入数据的返回结果
密码设置成功~~
名字:jack
余额:25.0
密码:123456

=====这里是acoount传入数据的返回结果
输入的名字长度应在2-4个字符,给你默认姓名:01
余额不足20,默认余额设为0
密码长度需要六位,请重新输入:123456

密码设置成功~~
名字:01
余额:0.0
密码:123456

小结:案例二充分体会了在不同类中调用方法