怎样解析java中的封装(怎样解析java中的封装文件)
wptr33 2025-06-23 22:42 4 浏览
1.解析java中的封装
1.1 以生活中的例子为例,打开电视机的时候你只需要按下开关键,电视机就会打开,我们通过这个操作我们可以去间接的对电视机里面的元器件进行亮屏和显示界面操作,具体怎么实现我们并不知道,我们只需要通过这个公共的电源键去对电视机进行操作就行。
1.2 封装也是同理,它会把一些属性(成员变量)拿个黑盒子装起来,然后使用者是直接接触不到这些属性的,使用时,通过一些公共方法(中间商)去进行访问。
1.3 是为了信息隐藏, 禁止直接访问 一个对象中的数据的实际表现形式,通过接口去进行访问
1.4 封装=私有化属性+公共调用属性的方法
2 为什么需要封装?
2.1 保证输入的数据是合理的
题目:定义一个Cat类,用户需手动输入猫的寿命;假设猫的最长寿命为20岁,那么输入大于20的数或者小于0的数字显然是非法的
没有封装时
示例代码
public class Cat {
String name;
String type;
int age;
public Cat(){
}
//定义有参构造,方便实例化对象时,初始化值
public Cat(String name, String type, int age) {
this.name = name;
this.type = type;
this.age = age;
}
public void showInfo(){
System.out.println("猫的名字为: "+name+" 猫的品种为: "+type+" 猫的年龄为: "+age);
}
}
TestCat
public class TestCat {
public static void main(String[] args) {
Cat cat=new Cat("叮当","狸花猫",100);
System.out.println("修改前: ");
cat.showInfo();
cat.age=-2;
System.out.println("修改后: ");
cat.showInfo();
}
}
可以明显的发现,用户可以通过 对象名.属性值 的方式去修改属性,而且修改属性的值没有限制,输入啥就输出啥,显然输入猫的年龄为200或者-2都是是错的
而且构造方法 初始化 时也没有去判断数据的合法性
示例代码运行截图
示例代码
public class Cat {
private String name;
private String type;
private int age;
public Cat(){
}
//定义有参构造,方便实例化对象时,初始化值
public Cat(String name, String type, int age) {
this.name = name;
this.type = type;
setAge(age);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(age<0||age>20){
System.out.println("初始化的年龄有误,请检查后重新输入!!!");
return;
}
this.age = age;
}
public void showInfo(){
System.out.println("猫的名字为: "+name+" 猫的品种为: "+type+" 猫的年龄为: "+age);
}
}
TestCat
public class TestCat {
public static void main(String[] args) {
Cat cat=new Cat("叮当","狸花猫",100);
System.out.println("修改前: ");
cat.showInfo();
System.out.println("修改后: ");
cat.setAge(10);
cat.showInfo();
}
}
你会发现实例化cat对象时,对年龄赋值的100并没有成功,因为没有符合年龄的条件,因而 被赋予了默认值
而通过set方法去设置(写入)合理的年龄,会发现年龄是可以被设置成功的
也就是说封装可以将一些不合理的数据过滤掉,不被赋值进去,这样可以使程序的数据变得更加合理。
示例代码运行截图
2.2 可以设置属性的特性(只读、可读写、可写)
没有封装时
示例代码
public class Cat {
String name;
String type;
int age;
public Cat(){
}
//定义有参构造,方便实例化对象时,初始化值
public Cat(String name, String type, int age) {
this.name = name;
this.type = type;
this.age=age;
}
public void showInfo(){
System.out.println("猫的名字为: "+name+" 猫的品种为: "+type+" 猫的年龄为: "+age);
}
}
TestCat
public class TestCat {
public static void main(String[] args) {
//猫的品种一经出生,就不能修改了,但是我这边还是可以通过对象名.属性名的方式去修改
Cat cat=new Cat("叮当","狸花猫",8);
System.out.println("修改猫的品种前: ");
cat.showInfo();
System.out.println("修改猫的品种后: ");
cat.type="短尾";
cat.showInfo();
}
}
按照常理来说,猫的品种一经出生就已经限定死了,也就是说它是 可读属性 ,但是上面的例子可却以对不可更改的属性进行修改,因此这就也是没有封装的一个弊端,属性的特性在它面前都是属于"我们都一样"的这种效果。”(啥都是可以读写)
示例代码运行截图
示例代码
public class Cat {
String name;
private String type;
int age;
public Cat(){
}
//定义有参构造,方便实例化对象时,初始化值
public Cat(String name, String type, int age) {
this.name = name;
this.type = type;
this.age=age;
}
//获取当前猫对象的品种
public String getType() {
return type;
}
public void showInfo(){
System.out.println("猫的名字为: "+name+" 猫的品种为: "+type+" 猫的年龄为: "+age);
}
}
TestCat
public class TestCat {
public static void main(String[] args) {
//猫的品种一经出生,就不能修改了,但是我这边还是可以通过对象名.属性名的方式去修改
Cat cat=new Cat("叮当","狸花猫",8);
System.out.println("修改猫的品种前: ");
cat.showInfo();
System.out.println("修改猫的品种后: ");
cat.type="短尾";
cat.showInfo();
}
}
按照常理来说,猫的品种一经出生就已经限定死了,也就是说它是 可读属性 ,但是上面的例子可却以对不可更改的属性进行修改,因此这就也是没有封装的一个弊端,属性的特性在它面前都是属于"我们都一样"的这种效果。”(啥都是可以读写)
示例代码运行截图
示例代码
public class Cat {
String name;
private String type;
int age;
public Cat(){
}
//定义有参构造,方便实例化对象时,初始化值
public Cat(String name, String type, int age) {
this.name = name;
this.type = type;
this.age=age;
}
//获取当前猫对象的品种
public String getType() {
return type;
}
public void showInfo(){
System.out.println("猫的名字为: "+name+" 猫的品种为: "+type+" 猫的年龄为: "+age);
}
}
TestCat
public class TestCat {
public static void main(String[] args) {
//猫的品种一经出生,就不能修改了,但是我这边还是可以通过对象名.属性名的方式去修改
Cat cat=new Cat("叮当","狸花猫",8);
System.out.println("修改猫的品种前: ");
cat.showInfo();
System.out.println("修改猫的品种后: ");
cat.type="短尾";
cat.showInfo();
}
}
这个时候程序不会正常运行,因为把type属性私有化后,不能通过对象名.属性名的方式进行调用,然后也只能通过getType方法获取它的值, 没有set方法 ,因此不能修改它的值
示例代码出现错误的截图
3 如何使用封装?
3.1 先私有化属性
private String name;
private String type;
private int age;
3.2 然后根据需求去进行公开方法(get/set)
//显然猫的名字是可读写性质,品种是只读属性,年龄为可读写属性
//为可读写属性就是set方法以及get方法都有,只读属性就是只有get方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//type(品种)属性只可以读取,不可以写入
public String getType() {
return type;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(age<0||age>20){
System.out.println("猫的年龄输入有误,请检查后重新输入!!!!");
return;
}
this.age = age;
}
3.3完整代码
public class Cat {
private String name;
private String type;
private int age;
public Cat(){
}
//定义有参构造,方便实例化对象时,初始化值
public Cat(String name, String type, int age) {
this.name = name;
this.type = type;
this.age=age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//type(品种)属性只可以读取,不可以写入
public String getType() {
return type;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(age<0||age>20){
System.out.println("猫的年龄输入有误,请检查后重新输入!!!!");
return;
}
this.age = age;
}
public void showInfo(){
System.out.println("猫的名字为: "+name+" 猫的品种为: "+type+" 猫的年龄为: "+age);
}
}
TestCat
public class TestCat {
public static void main(String[] args) {
//猫的品种一经出生,就不能修改了,但是我这边还是可以通过对象名.属性名的方式去修改
Cat cat=new Cat("叮当","狸花猫",8);
System.out.println("一年前: ");
cat.showInfo();
cat.setName("小梦");
System.out.println("获取猫的品种: "+cat.getType());
cat.setAge(9);
System.out.println("一年后: ");
cat.showInfo();
}
}
3.4 完整代码运行截图
相关推荐
- 十年之重修Redis原理(redis重试机制)
-
弱小和无知并不是生存的障碍,傲慢才是。--------面试者...
- Redis 中ZSET数据类型命令使用及对应场景总结
-
1.zadd添加元素zaddkeyscoremember...
- redis总结(redis常用)
-
RedisTemplate封装的工具类packagehk.com.easyview.common.helper;importcom.alibaba.fastjson.JSONObject;...
- 配置热更新系统(如何实现热更新)
-
整体设计概览┌────────────┐┌────────────────┐┌────────────┐│配置后台服务│--写入-->│Red...
- java高级用法之:调用本地方法的利器JNA
-
简介JAVA是可以调用本地方法的,官方提供的调用方式叫做JNI,全称叫做javanativeinterface。要想使用JNI,我们需要在JAVA代码中定义native方法,然后通过javah命令...
- SpringBoot:如何优雅地进行响应数据封装、异常处理
-
背景越来越多的项目开始基于前后端分离的模式进行开发,这对后端接口的报文格式便有了一定的要求。通常,我们会采用JSON格式作为前后端交换数据格式,从而减少沟通成本等。...
- Java中有了基本类型为什么还要有包装类型(封装类型)
-
Java中基本数据类型与包装类型有:...
- java面向对象三大特性:封装、继承、多态——举例说明(转载)
-
概念封装:封装就是将客观的事物抽象成类,类中存在属于这个类的属性和方法。...
- java 面向对象编程:封装、继承、多态
-
Java中的封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism)是面向对象编程的三大基本概念。它们有助于提高代码的可重用性、可扩展性和可维护性。...
- 怎样解析java中的封装(怎样解析java中的封装文件)
-
1.解析java中的封装1.1以生活中的例子为例,打开电视机的时候你只需要按下开关键,电视机就会打开,我们通过这个操作我们可以去间接的对电视机里面的元器件进行亮屏和显示界面操作,具体怎么实现我们并不...
- python 示例代码(python代码详解)
-
以下是35个python代码示例,涵盖了从基础到高级的各种应用场景。这些示例旨在帮助你学习和理解python编程的各个方面。1.Hello,World!#python...
- python 进阶突破——内置模块(Standard Library)
-
Python提供了丰富的内置模块(StandardLibrary),无需安装即可直接使用。以下是一些常用的内置模块及其主要功能:1.文件与系统操作...
- Python程序员如何调试和分析Python脚本程序?附代码实现
-
调试和分析Python脚本程序调试技术和分析技术在Python开发中发挥着重要作用。调试器可以设置条件断点,帮助程序员分析所有代码。而分析器可以运行程序,并提供运行时的详细信息,同时也能找出程序中的性...
- python中,函数和方法异同点(python方法和函数的区别)
-
在Python中,函数(Function)...
- Python入门基础命令详解(python基础入门教程)
-
以下是Python基本命令的详解指南,专为初学者设计,涵盖基础语法、常用操作和实用示例:Python基本命令详解:入门必备指南1.Python简介特点:简洁易读、跨平台、丰富的库支持...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
因果推断Matching方式实现代码 因果推断模型
-
git pull命令使用实例 git pull--rebase
-
面试官:git pull是哪两个指令的组合?
-
git 执行pull错误如何撤销 git pull fail
-
git fetch 和git pull 的异同 git中fetch和pull的区别
-
git pull 和git fetch 命令分别有什么作用?二者有什么区别?
-
git pull 之后本地代码被覆盖 解决方案
-
还可以这样玩?Git基本原理及各种骚操作,涨知识了
-
git命令之pull git.pull
-
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)