Java中的封装和封装的案例

目录

封装

封装的实现步骤

封装的例子

 封装实现的意义

封装的综合应用案例

封装

封装隐藏了类的内部实现机制,可以不在影响使用的情况下改变了类的内部结构,同时也保护了数据。对外界而言它的内部细节是隐藏的,暴露给外界的只是它的访问方法。

属性的封装:使用者只能通过事先定制好的方法来访问数据,可以方便地加入逻辑控制,限制对属性的不合理操作

方法的封装:使用者按照既定的方式调用方法,不必关心方法的内部实现,便于使用,便于修改,增强代码的可维护性

封装的实现步骤

  1. 通过访问限制符修改类中属性的可见性,从而限制对类中属性的访问。
  2. 对每个值属性提供对外访问的公共方法,即创建get/set方法,来为外部程序提供对类中的私有属性进行访问的途径。
  3. 在get/set方法中添加控制语句规范代码

封装的例子

设置私有属性,设置get/set方法,可以通过Alt+insert自动生成,也可以自己写一些代码来控制

package encapsulation;

/**
 * @description:
 * @author: 解颜
 * @date: 2022/3/12 19:45
 */
public class Person {
    private String name;
    private int age;
    private String sex;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

      public void setSex(String sex) {
        if(sex=="男"||sex=="女")
            this.sex = sex;
        else
            return;
    }
}

 封装实现的意义

可以过滤一些非法赋值

封装说明一个类行为和属性与其他类的关系,低耦合,高内聚;

封装的综合应用案例

封装的综合应用案例参照:https://blog.csdn.net/y20_20/article/details/98367664

1. 模拟场景实现

(1)、需求:某校开设计算机科学与应用专业,专业编号J0001,学制四年,现有3名学生报名学习了这个专业

(2)、需求分析:专业类(专业名称、专业编号、学制年限)、方法(专业相信信息);学生类(学生姓名、学号、性别、年龄、专业对象)、方法(介绍学生信息及所学专业)

(3)、实现专业和学生关联:

方案一:在学生类的自我 介绍 方法中,添加2个参数:专业名称和学制年限
方案二:在学生类的自我 介绍 方法中,在方法中添加1个专业对象作为参数,通过其属性获得相关信息
 方案三:在类中添加专业对象作为属性,通过其属性获得相关信息
(4)案例扩展:

扩展功能:实现某种专业下统计报名学习的人数

扩展功能实现:在专业类中添加数组、统计人数2个属性,同时添加一个添加学生对象的方法将对象添加进去并统计人数

2. 模拟场景代码实现

编写Subject类:

package encapsulation;

/**
 * @description:
 * @author: 解颜
 * @date: 2022/3/12 20:12
 */
public class Subject {
    /*
     * 封装的步骤一:将属性设置为私有,禁止类外部进行访问
     */
    private String subjectName;//专业名称
    private String subjectNum;//专业编号
    private int subjectTime;//专业学时
    private Student[] studentArray;//用来存储选修某专业的学生对象
    private int studentCount;//记录选修某专业的人数
    public Student[] getStudentArray() {
        if(studentArray==null)
            this.studentArray=new Student[200];
        return studentArray;
    }
    public void setStudentArray(Student[] studentArray) {
        this.studentArray = studentArray;
    }

    //无参构造方法
    public Subject(){

    }
    //有参构造方法
    public Subject(String subjectName,String subjectNum,int subjectTime) {
        this.setSubjectName(subjectName);
        this.setSubjectNum(subjectNum);
        this.setSubjectTime(subjectTime);
    }
    //有参构造
    public Subject(String subjectName,String subjectNum,int subjectTime,Student[] studentArray) {
        this.setSubjectName(subjectName);
        this.setSubjectNum(subjectNum);
        this.setSubjectTime(subjectTime);
        this.setStudentArray(studentArray);
    }
    public int getStudentCount() {
        return studentCount;
    }
    public void setStudentCount(int studentCount) {
        this.studentCount = studentCount;
    }
    /*
     * 封装类的步骤二:设置类外部访问属性的接口
     * 封装类 的步骤三:通过getter/setter方法添加控制语句
     */
    //预留访问类的接口
    public void setSubjectName(String subjectName) {
        this.subjectName=subjectName;
    }
    public String getSubjectName() {
        return this.subjectName;
    }

    public void setSubjectNum(String SubjectNum) {
        this.subjectNum=SubjectNum;
    }
    public String getSubjectNum() {
        return this.subjectNum;
    }

    public void setSubjectTime(int subjectTime) {
        if(subjectTime<=0)
            return;
        this.subjectTime=subjectTime;
    }
    public int getSubjectTime() {
        return this.subjectTime;
    }
    //在类中编写一个输出详细信息的方法
    public String printDetail() {
        String ref="专业详细信息为:\n专业名称:"+this.getSubjectName()+"\n专业编号:"
                +this.getSubjectNum()+"\n学时:"+this.getSubjectTime();
        return ref;
    }
    /**
     * 添加学员到数组中并记录数组中成员个数
     * @param student 传递进入方法的学生对象
     */
    public void addStudent(Student student) {
        for (int i = 0; i < this.getStudentArray().length; i++) {
            if (this.getStudentArray()[i] == null) {
                this.getStudentArray()[i] = student;
                this.studentCount = i + 1;
                return;
            }
        }
    }
}

编写Student类:

package encapsulation;

/**
 * @description:
 * @author: 解颜
 * @date: 2022/3/12 20:13
 */
public class Student {
    private String studentNo;
    private String studentName;
    private String studentSex;
    private int studentAge;
    //方案三,将学科对象作为属性
    private Subject subject;

    public Subject getSubject() {
        if(subject==null)
            subject=new Subject();
        return subject;
    }
    public void setSubject(Subject subject) {
        this.subject = subject;
    }
    //无参构造
    public Student() {

    }
    //多参构造,实现对全部属性的赋值
    public Student(String studentNo,String studnetName,String studentSex,int studentAge) {
        this.setStudentNo(studentNo);
        this.setStudentName(studnetName);
        this.setStudentSex(studentSex);
        this.setStudentAge(studentAge);
    }
    //将Subject对象初始化的构造函数
    public Student(String studentNo,String studnetName,String studentSex,int studentAge,Subject subject) {
        this.setStudentNo(studentNo);
        this.setStudentName(studnetName);
        this.setStudentSex(studentSex);
        this.setStudentAge(studentAge);
        this.setSubject(subject);
    }
    public String getStudentNo() {
        return studentNo;
    }
    public void setStudentNo(String studentNo) {
        this.studentNo = studentNo;
    }
    public String getStudentName() {
        return studentName;
    }
    public void setStudentName(String studentName) {
        this.studentName = studentName;
    }
    public String getStudentSex() {
        return studentSex;
    }
    public void setStudentSex(String studentSex) {
        if(studentSex=="男"||studentSex=="女")
            this.studentSex = studentSex;
        else
            return;
    }
    public int getStudentAge() {
        return studentAge;
    }
    public void setStudentAge(int studentAge) {
        if(studentAge<=0||studentAge>100)
            studentAge=18;
        this.studentAge = studentAge;
    }
    /**
     * 介绍学生详细信息的方法(新增方法参数)
     * @return 返回学生姓名、学号、年龄、性别、专业名称、学制年限等信息
     */
    public String studentInfo(String subjectName,int subjectTime) {
        String ref="学生详细信息:\n学生姓名:"+this.getStudentName()+"\n学生学号:"+
                this.getStudentNo()+"\n学生年龄:"+this.getStudentAge()+"\n学生性别:"+
                this.getStudentSex()+"\n所学专业名称:"+subjectName+"\n学制年限:"+subjectTime;
        return ref;
    }
    /**
     * 学生详细信息介绍的方法重载(将对象作为方法参数)
     * @return 返回学生姓名、学号、年龄、性别、专业名称、学制年限等信息
     */
    public String studentInfo(Subject subject) {
        String ref="学生详细信息:\n学生姓名:"+this.getStudentName()+"\n学生学号:"+
                this.getStudentNo()+"\n学生年龄:"+this.getStudentAge()+"\n学生性别:"+
                this.getStudentSex()+"\n所学专业名称:"+subject.getSubjectName()+"\n学制年限:"+subject.getSubjectTime();
        return ref;
    }
    /**
     * 返回学生相信信息介绍方法(将对象作为类的属性)
     * @return 返回学生姓名、学号、年龄、性别、专业名称、学制年限等信息
     */
    public String studentInfo() {
        String ref="学生详细信息:\n学生姓名:"+this.getStudentName()+"\n学生学号:"+
                this.getStudentNo()+"\n学生年龄:"+this.getStudentAge()+"\n学生性别:"+
                this.getStudentSex()+"\n所学专业名称:"+this.getSubject().getSubjectName()+"\n学制年限:"
                +this.getSubject().getSubjectTime();
        return ref;
    }
}

编写Test类:

package encapsulation;

/**
 * @description:
 * @author: 解颜
 * @date: 2022/3/12 20:14
 */
public class Test {
    public static void main(String[] args) {
        Subject subject = new Subject("计算机科学与应用", "j0001", 4);
        System.out.println(subject.printDetail());
        System.out.println("-------------在方法中通过新增参数实现扩展-------------");
        Student student = new Student("s01", "张三", "男", 18);
        System.out.println(student.studentInfo("计算机科学与应用", 4));
        System.out.println("------------将对象作为方法参数--------------");
        Student student1 = new Student("s02", "李四", "女", 28);
        System.out.println(student1.studentInfo(subject));
        System.out.println("-------------将对象作为类的属性-------------");
        Student student2 = new Student("s03", "王五", "女", 17, subject);
        System.out.println(student2.studentInfo());
        System.out.println("-------------想知道一个专业到底有多少个学生选修-------------");
        subject.addStudent(student2);
        subject.addStudent(student1);
        subject.addStudent(student);
        System.out.println("选修" + subject.getSubjectName() + "专业的学生有" + subject.getStudentCount() + "名");
    }
}

运行结果 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赚钱去流浪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值