Java封装和封装的案例

本文介绍了Java封装的概念,强调了其在面向对象编程中的重要性。详细讲述了封装的实现步骤,包括使用private修饰属性、创建getter/setter方法,并通过示例解释了封装的意义。此外,还讲解了Java中的包、导入包的语法以及静态关键字和代码块的用法。最后,通过一个模拟场景展示了封装在实际应用中的例子,包括统计特定专业学生人数的功能。

Java封装和封装的案例

目录

一、Java封装知识点简介

二、Java程序中的包

三、static关键字、代码块

四、封装的综合应用案例:


一、Java封装知识点简介

1、面向对象三大特性之封装的概念:

  • 隐藏类的某些内部细节,不允许外部程序直接访问
  • 隐藏某些细节的类提供某些公共方法,对隐藏的内部细节进行访问和修改
  • 隐藏对象的信息
  • 留出访问的接口

2、封装的特征:

  • 只能通过类提供的方法访问和修改数据
  • 隐藏类的实现细节,方便修改和实现

3、封装的实现步骤:

(1)、步骤:第一、修改属性的修饰符为private;第二、创建get/set方法来访问和修改属性值;第三、在get/set方法中添加控制语句规范代码

(2)封装实现代码示例:创建getter/setter方法可以通过【源码】——【生成getter/setter方法来自动创建】

package com.imooc.model;

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;
	}
	/**
	 * 介绍学生详细信息的方法(新增方法参数)
	 * @param subjectName所学专业名称
	 * @param subjectTime所学专业学时
	 * @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;
	}
	/**
	 * 学生详细信息介绍的方法重载(将对象作为方法参数)
	 * @param subject专业对象名参数
	 * @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;
	}
	
}

4、封装实现的意义:

(1)、类的初始化时的三种初始化赋值方式:

  • 带参数的构造方法直接赋值
  • 通过添加了流程控制语句的getter/setter方法赋值
  • 带参构造方法中调用getter/setter方法达到过滤作用

(2)、意义:可以过滤一些非法赋值。如:

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

二、Java程序中的包

1、包的概念:计算机中用文件进行存储,用文件夹对文件进行管理。类似用Java文件存储源码,用包管理Java文件

2、包的作用:

  • 管理Java文件
  • 与计算机中在 不同文件夹下的同名文件被允许一样。解决同名文件文件名冲突问题

3、包的定义语法:

package 包名;

示例:

package com.model.project;

定义包时应注意:

  • 定义包的语法必须放在Java源文件的第一行
  • 一个Java源文件只能有一个package语句
  • 包名全部英文小写
  • 包名的命名规范:域名倒序+模块名+功能名

4、导入包的语法:

import 包名.类名;//导入当前包下的某个类

示例:import com.imooc.model.Dog;//导入com.imooc.model包下的Dog类

import 包名.*;//导入当前包下的全部类

示例:import com.imooc.model.*;//导入com.imooc.model包下的所有类

5、常用系统包:

  • java.lang:包含Java语言基础的类
  • Java.util:包含Java语言中各种工具类
  • Java.io:包含输入输出相关功能的类

三、static关键字、代码块

1、static关键字:

static关键字 +属性静态属性
static关键字+方法静态方法
static关键字+类名不存在
static关键字+方法内部局部变量不存在

注意:静态成员随类加载产生,直到类销毁才回收

2、静态方法:

  • 可以直接调用同类中的静态成员
  • 不可以直接调用同类中的其他非静态成员
  • 可以通过实例化对象后,对象名点方法名的方式调用非静态 成员

3、代码块:

  • 通过{}形成代码块
  • 方法内的代码块称为普通代码块
  • 类内的代码块称为构造代码块
  • 在构造代码块钱加static关键字称为静态代码块

4、代码块的执行顺序:

  • 无论实例产生多少对象,静态代码块只执行一次
  • 构造代码块随实例化过程调用
  • 普通代码块随方法调用执行

四、封装的综合应用案例:

1、模拟场景实现:

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

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

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

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

(4)案例扩展:

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

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

2、模拟场景代码实现:

(1)、实现步骤:

步骤一:在eclipse中国添加2个包model和test

步骤二:在model包中添加2个类Student和Subject;在test包中添加Test类

步骤三:按照封装的步骤(将属性设置为private;设置get/set方法;在get/set方法中加入流程控制语句)一次编写model包中的2歌类

步骤四:在Text类中做测试 

(2)、编写Subject类:

package com.imooc.model;

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;
			}
		}
	}
}

(2)、编写Student类:

package com.imooc.model;

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;
	}
	/**
	 * 介绍学生详细信息的方法(新增方法参数)
	 * @param subjectName所学专业名称
	 * @param subjectTime所学专业学时
	 * @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;
	}
	/**
	 * 学生详细信息介绍的方法重载(将对象作为方法参数)
	 * @param subject专业对象名参数
	 * @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;
	}
	
}

(4)、编写Test测试类:

package com.imooc.common;

import com.imooc.model.Student;
import com.imooc.model.Subject;

//import java.util.Scanner;
public class CharDemo {

	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()+"名");
	}
}

(5)、运行结果如下:

专业详细信息为:
专业名称:计算机科学与应用
专业编号:j0001
学时:4
-------------在方法中通过新增参数实现扩展-------------
学生详细信息:
学生姓名:张三
学生学号:s01
学生年龄:18
学生性别:男
所学专业名称:计算机科学与应用
学制年限:4
------------将对象作为方法参数--------------
学生详细信息:
学生姓名:李四
学生学号:s02
学生年龄:28
学生性别:女
所学专业名称:计算机科学与应用
学制年限:4
-------------将对象作为类的属性-------------
学生详细信息:
学生姓名:王五
学生学号:s03
学生年龄:17
学生性别:女
所学专业名称:计算机科学与应用
学制年限:4
-------------想知道一个专业到底有多少个学生选修-------------
选修计算机科学与应用专业的学生有3名

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值