Java封装和封装的案例

article/2025/11/7 7:23:49

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

 


http://chatgpt.dhexx.cn/article/gDf9NmZ0.shtml

相关文章

Java的封装方法

在面向对象程式设计方法中&#xff0c;封装&#xff08;英文名称&#xff1a;Encapsulation&#xff09;是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。封装可以被认为是一个保护屏障&#xff0c;防止该类的代码和数据被外部类定义的代码随机访问。要访问该类的…

Java封装如何封装 封装的好处是什么?

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、封装的作用是什么&#xff1f;二、封装的好处三、封装的步骤 1.引入库2.private的应用总结 前言 我要看电视&#xff0c;只需要按一下开关和换台就可以了。…

15、JAVA入门——封装

目录 一、封装 1、封装概述 2、封装的步骤 二、Java里的包 1、包的概述 2、包的定义 3、包的使用 4、注意事项 三、Java访问修饰符 1、类和类成员的访问控制 2、类的访问修饰符 3、类成员的访问修饰符 四、static关键字 1、static特点 2、static修饰属性 3、static修饰方法 4、…

初学java封装

封装 初识java封装 封装的用处&#xff1a; 1.提高程序的安全性&#xff0c;保护数据 2.隐藏代码的实现细节 3.统一接口 4.增加系统可维护性 这里创建一个类 public class Package {//属性私有private String name;//名字private int age; //年龄private int sex;//性别//1.…

java如何实现封装_java如何实现封装

Java中类的封装是如何实现的封装是将对象的信息隐藏在对象内部,禁止外部程序直接访问对象内部的属性和方法。 java封装类通过三个步骤实现: (1)修改属性的可见性,限制访问。 (2)设置属性的读取方法。 (3)在读取属性的方法中,添加对属性读取的限制。 Java中什么叫封装呢? 继…

java封装dll文件_java类封装成dll

1&#xff0c;建立测试类&#xff0c;注意英文注释部分&#xff0c;用汉语直接编译会乱码 public classHello {//native method is used for call other language procedure//if use chinese here then Compile would be gibberish public native voidprintHello();static{ Sys…

java之封装

1.封装 1. 封装 1.1 private关键字 private是一个修饰符&#xff0c;可以用来修饰成员&#xff08;成员变量&#xff0c;成员方法&#xff09; 被private修饰的成员&#xff0c;只能在本类进行访问&#xff0c;针对private修饰的成员变量&#xff0c;如果需要被其他类使用&…

【JavaScript】js中非常常见的面试题

文章目录 1、手动实现防抖和节流2、let、const、var 的区别3、箭头函数与普通函数区别4、Promise5、数据类型6、检测数据类型的常用方法1 .typeof2 . instanceof3 .constructor4 . 使用 Object.prototype.toString.call()检测对象类型⭐5 . 自己封装函数6、isArray 7、数组的常…

JS的100道经典面试题(一)只看这四篇就够了,收藏起来以后偷偷看

年轻人你不讲武德&#xff0c;耗子尾汁~~~ 总结就是为了形成自己的js知识网&#xff0c;提升自己&#xff0c;加油&#xff01; 开始干 1、介绍js的基本数据类型   答&#xff1a; Undefined、Null、Boolean、Number、String 2、js有哪些内置对象&#xff1f;  答&…

大前端JS部分基础面试题(含答案)

1.几种基本数据类型?复杂数据类型?值类型和引用数据类型?堆栈数据结构? 基本数据类型&#xff1a;Undefined、Null、Boolean、Number、String 值类型&#xff1a;数值、布尔值、null、undefined。 引用类型&#xff1a;对象、数组、函数。 堆栈数据结构&#xff1a;是一种支…

Js面试题__附答案

1、什么是JavaScript&#xff1f;&#xff08;这是基本题&#xff0c;对很多程序员来说也是送分题&#xff01;&#xff09; JavaScript是客户端和服务器端脚本语言&#xff0c;可以插入到HTML页面中&#xff0c;并且是目前较热门的Web开发语言。同时&#xff0c;JavaScript也…

js 变量及作用域经典面试题

function Foo() {getName function () { alert (1); };return this; } Foo.getName function () { alert (2);}; Foo.prototype.getName function () { alert (3);}; var getName function () { alert (4);}; function getName() { alert (5);}//请写出以下输出结果&#x…

前端面试题集锦——JavaScript

JavaScript 栈和队列的区别? 栈的插入和删除操作都是在一端进行的&#xff0c;而队列的操作却是在两端进行的。 队列先进先出&#xff0c;栈先进后出。 栈只允许在表尾一端进行插入和删除&#xff0c;而队列只允许在表尾一端进行插入&#xff0c;在表头一端进行删除 栈和…

收集的面试题 js面试题

题库推荐网址&#xff1a;https://github.com/FEGuideTeam/FEGuide/tree/master/javascript%E9%97%AE%E9%A2%98 第1题: ## JavaScript 由以下三部分组成&#xff1a;1. ECMAScript&#xff08;核心&#xff09;&#xff1a;JavaScript 语言基础2. DOM&#xff08;文档对象模…

JS闭包+常见面试题

scope作用域 、Closure闭包对象 可以借助chrome调式工具查看闭包对象 注意&#xff1a;function声明存在变量提升&#xff0c;所以22行已经存在闭包对象了&#xff1b; 闭包产生的条件&#xff1a; 函数嵌套&#xff1b;嵌套的内部函数引用了外部函数的变量才会产生闭包对象…

前端面试题汇总(含答案)(JS篇)

主要自用&#xff0c;持续更新&#xff0c;相同类型的题目尽量放在了一起&#xff0c;参考的实在太多了就没有列出&#xff0c;侵权烦请联系删除。提示&#xff1a;自动生成的目录在页面右边---------->>>>>>>>>>>>>>>> Js的…

前端面试题(js篇)

1.解释一下什么是闭包 什么是闭包&#xff1a;函数使用了不属于自己的局部变量(函数套函数&#xff0c;里面函数使用了外面函数定义的变量) 闭包的作用&#xff1a;避免全局污染 闭包的缺点&#xff1a;使用过多会造成内存泄漏&#xff08;占用的内存释放不掉&#xff09; 2.…

js 实现页面隐藏、关闭、刷新给出对应的提示

我们在做项目的时候经常会遇到一些需求&#xff0c;比如在某些页面当点击浏览器刷新 或者关闭的时候会有对应的提示&#xff0c;是否离开或者重新加载此网站。比如csdn写文章的时候就有这个弹窗&#xff0c;这功能就是用onbeforeunload实现的。 注意&#xff1a;如果你加载下面…

js面试题大坑——隐式类型转换

1.1 隐式转换介绍 1.2 隐式转换规则 1.3 坑一&#xff1a;字符串连接符与算术运算符隐式转换规则混淆 1.4 坑二&#xff1a;关系运算符&#xff1a;会把其他数据类型转换成number之后再比较关系 1.5 坑三&#xff1a;复杂数据类型在隐式转换时会先转成String&#xff0…

u一点·料:阿里巴巴1688ued体验设计践行之路

U一点料 阿里巴巴1688UED体验设计践行之路 阿里巴巴1688用户体验部著 图书在版编目&#xff08;CIP&#xff09;数据 U一点料&#xff1a;阿里巴巴1688UED体验设计践行之路/阿里巴巴1688用户体验部著. —北京&#xff1a;机械工业出版社&#xff0c;2015.8 ISBN 978-7-111-5122…