JAVA 封装

封装

面向对象的三大基本特征:封装,继承,多态

一、封装介绍

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

二、封装的理解和好处

  1. 隐藏实现的细节,方法(连接数据库) <-- 调用(传入参数)
  2. 可以对数据进行验证,保证安全合理

三、封装的实现步骤

  1. 将属性进行私有化private,[不能直接修改]

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

    public void setXxx(类型 参数名){//Xxx表示某个属性
    	//加入数据验证的业务逻辑
        属性 = 参数名;
    }
    
  3. 提供一个公共的get方法,用于获取属性的值

    public XX getXxx(){//权限判断
        return xx;
    }
    
  4. 将构造器和set 进行结合


快速入门

题目:请大家看一个小程序(com.hspedu.encap: Encapsulation01.java),

  1. 不能随便查看人的年龄,工资等隐私,并对设置的年龄进行合理的验证。年龄合理就设置,否则给默认 年龄, 必须在 1-120, 年龄,
  2. 工资不能直接查看 , name 的长度在 2-6 字符 之间
package com.hspedu.encap;

import java.util.Scanner;

public class Encapsulation01 {
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("小杨 123456879");
        person.setAge(21);
        person.setSalary(6000);
        System.out.println(person.info());

        //如果我们直接使用构造器指定属性
        System.out.println("smithi的信息");
        Person smith = new Person("smith", 130, 7000);
        System.out.println(smith.info());

    }
}

/*
1. 不能随便查看人的年龄,工资等隐私,并对设置的年龄进行合理的验证。
   年龄合理就设置,否则给默认 年龄, 必须在 1-120
2. 工资不能直接查看,name 的长度在 2-6 字符 之间
 */

class Person{
    public String name;
    private int age;//年龄 私有化
    private double salary;

    //构造器
    public Person() {

    }

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

    //自己写setXxx getXxx 太慢,使用快捷键 -> alt + inset -> getter and setter
   //然后根据要求来完善我们的代码
    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() {
        //可以对当前对象的权限判断
        Scanner scanner = new Scanner(System.in);
        int password = 123456;
        if( password == 123456){
            return salary;
        }else{
            System.out.println("输入的密码有误,无法查看");
            return 0;
        }
    }

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

    //写一个方法,返回属性信息
    public String info(){
        return "info name=" + name + " age=" + age + " salary=" + salary;
    }
}

四、练习

题目:

创建程序,在其中定义两个类:

Account 和 AccountTest 类体会 Java 的封装性。

  1. Account 类要求具有属性:姓名(长度为 2 位 3 位或 4 位)、余额(必须>20)、 密码(必须是六位), 如果不满足,则给出提示信息,并给默认值(程序员自己定) 通过 setXxx 的方法给 Account 的属性赋值。

  2. 在 AccountTest 中测试

Account.java

package com.hspedu.encap;

import java.util.Scanner;

public class Account {
    private String name;
    private double money;
    private String password;

    public Account() {

    }
    public Account(String name, double money, String password) {
        setName(name);
        setMoney(money);
        setPassword(password);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        if (name != null && name.length() >= 2 && name.length() <= 4) {
            this.name = name;
        } else {
            this.name = "无名";
            System.out.println("用户名的长度需在 2~4 个字符之间,默认为无名");
        }
    }

    public double getMoney() {
        return money;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        if (password.length()==6){
            this.password = password;
        }else{
            this.password = "123456";
            System.out.println("密码必须为6位,已设为默认密码123456");
        }
    }

    //获取信息
    public String getInfo(){
        System.out.println("请输入密码:");
        Scanner sc = new Scanner(System.in);
        while(true){
            if(sc.next().equals(password)){
                return name + "信息如下:\n" + "姓名:" + name + " 余额:" + money +  " 密码:" + password;
            }else{
                System.out.println("密码错误请重新输入");
            }
        }
    }
}

AccountTest.java

package com.hspedu.encap;

import com.hspedu.modifier.A;

public class AccountTest {
    public static void main(String[] args) {
        Account at = new Account();
        at.setName("小杨");
        at.setMoney(2);
        at.setPassword("1111111");
        System.out.println(at.getInfo());
    }
}
posted @ 2022-01-27 16:14  DL50  阅读(58)  评论(0编辑  收藏  举报