0
点赞
收藏
分享

微信扫一扫

第十一章 JavaSE专题之面向对象三大特性-封装

夏侯居坤叶叔尘 2022-02-08 阅读 71
java

1、封装概述

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

  • 封装实现步骤

    • 1、隐藏实现细节:方法(连接数据库) <-- 调用(传入参数…)
    • 2、可以对数据进行验证,保证安全合理(类似check约束)
// 第一步、将属性进行私有化private;【不能直接修改属性】;
// 第二步、提供一个公共的public set方法,用于对属性进行判断并赋值;

public void setXxx(类型 参数名){ //Xxx表示某个属性
    //加入数据验证的业务逻辑
    属性 = 参数名
}

//第三步、提供一个公共的(public) get方法,用于获取属性的值;

public 数据类型 getXxx(){//	权限判断
    return xx;
    
}
  • 范例:业务场景描述如下
    • 查看下程序(com.zrsj.fz:Person.java):
    • 不能随便查看人的年龄,工资等隐私,并对设置的年龄进行合理的验证。年龄合理就设置,否则就默认;
    • 年龄必须在1-120,年龄,工资不能直接查看,name的长度在2-6字符之间

在这里插入图片描述
(1)编写Person类

public class Person {
    public String name;     //名字公开
    private int age;        //age私有化
    private double salary;  //..

    //alt+insert


    public Person() {
    }

    public Person(String name, int age, double salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;

        //将set方法写在构造器中,这样仍然可以验证
        setSalary(salary);
        setName(name);
        setAge(age);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        //1、加入对数据的校验,相当于增加了默认逻辑
        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;
    }
}

(2)实例化Person类

public class hello {
    public static void main(String[] args) {
        Person person = new Person("赵谦孙李周吴郑王",1000,1000);
        String output= person.info();
        System.out.println(output);
    }
}
  • 运行结果

在这里插入图片描述

2、封装与构造器

2.1、有参构造器:会破解封装机制
//main方法
public class FzMain {
    public static void main(String[] args) {
        Person person = new Person("赵谦孙李周吴郑王",1000,1000);
        String output= person.info();
        System.out.println(output);
    }
}



//Person类的封装
public class Person {
    public String name;     //名字公开
    private int age;        //age私有化
    private double salary;  //..

    //alt+insert


    public Person() {
    }

    public Person(String name, int age, double salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;

        //将防护机制写入到set里面

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        //1、加入对数据的校验,相当于增加了默认逻辑
        if(name.length() >=2 && name.length()<=6) {
            this.name = name;
        } else {
            System.out.println("名字的长度不对,需要2到6字符,默认名字");
        }
    }

    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;
    }
}
  • 运行结果:

在这里插入图片描述

2.2、优化:将set方法写在构造器中
//main方法
package com.zrsj.fz;

public class FzMain {
    public static void main(String[] args) {
        Person person = new Person("赵谦孙李周吴郑王",1000,1000);
        String output= person.info();
        System.out.println(output);
    }
}


//优化后的构造器 - 将set方法写在构造器中
package com.zrsj.fz;

public class Person {
    public String name;     //名字公开
    private int age;        //age私有化
    private double salary;  //..

    //alt+insert


    public Person() {
    }

    public Person(String name, int age, double salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;

        //将set方法写在构造器中,这样仍然可以验证
        setSalary(salary);
        setName(name);
        setAge(age);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        //1、加入对数据的校验,相当于增加了默认逻辑
        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;
    }
}
  • 运行结果:

在这里插入图片描述

举报

相关推荐

0 条评论