目录
封装
封装隐藏了类的内部实现机制,可以不在影响使用的情况下改变了类的内部结构,同时也保护了数据。对外界而言它的内部细节是隐藏的,暴露给外界的只是它的访问方法。
属性的封装:使用者只能通过事先定制好的方法来访问数据,可以方便地加入逻辑控制,限制对属性的不合理操作
方法的封装:使用者按照既定的方式调用方法,不必关心方法的内部实现,便于使用,便于修改,增强代码的可维护性
封装的实现步骤
- 通过访问限制符修改类中属性的可见性,从而限制对类中属性的访问。
- 对每个值属性提供对外访问的公共方法,即创建get/set方法,来为外部程序提供对类中的私有属性进行访问的途径。
- 在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() + "名");
}
}
运行结果