[Java] 封装

目录

1. 什么是封装 

2. 访问修饰符

3. 封装的好处

4. 封装的步骤

5. 包

5.1 什么是包

5.2 导入包中的类

5.3 自定义包

5.4 常用的包

6. static关键字

6.1 static修饰成员变量

6.2 static修饰成员方法

6.3 Static修饰成员变量初始化

7. 代码块

7.1 普通代码块

7.2 构造代码块

7.3 静态代码块

7.4 各种初始化

8. 对象的打印


1. 什么是封装 

封装就是对类里面的成员变量和成员方法进行隐藏,只能在所在类的范围内使用,只留下一些可以被外部访问的方法,供外部调用,隐藏方法实现的内部细节。

这就好比一台电视机,给你提供了一个遥控器供你使用,进行一系列操作,但是操作的内部细节你看不到,只是通过遥控器来实现功能。

2. 访问修饰符

Java当中是通过类和访问权限来实现封装的,类可以实现数据和封装的数据存储在一起,而访问修饰符则可以设置数据的访问权限。

访问限定符有四个:private , default , protected , public 。它们的访问权限也是不一样的。如图所示:

private修饰的属性和方法只能在类内部使用,不能在类外部直接使用。

3. 封装的好处

1.可以隐藏类内部的实现细节。

2.可以保证安全和合理,比如说要对属性设置值,可以在封装的类里面先判断设置的值是否合理,再考虑是否赋值。

4. 封装的步骤

1.对属性和方法进行私有化(只能在类里面使用,不能直接修改值)

2. 设置public的set方法实现对私有的属性的判断和赋值。

3. 设置public的get方法对权限进行判断,进而得到私有属性的值。

举个Student类的例子:

class Student{private String name;private int age;private String stuNum;public void setName(String name) {this.name = name;}public String getName() {return name;}
}public class Test {public static void main(String[] args) {Student student = new Student();student.setName("张三");System.out.println(student.getName());}
}

上面就是设置的两个公共方法一个设置成员变量的值,一个返回成员变量的值。

但是每个成员变量都要写过于麻烦,因此idea提供一种快捷方法,可以直接生成这两个方法:

1.鼠标在类内部右击找到下面的选项:

2. 找到下面选项: 

3. 把需要生成的成员变量选上,ok。 

 这样就实现了间接访问成员变量。

但是为什么把属性设置成了私有还可以被外部间接访问呢?

        因为,封装的属性和方法是为类内部的其他方法提供的,而设置的一些公共类的方法就可以被外部所访问,而这个方法有可以使用封装的属性和方法,这样既隐藏了封装的方法的内部细节,又可以通过公共方法给外部间接使用。

5. 包

5.1 什么是包

        包本质上是对类的一种管理形式,包里面包含了很多的类,也就相当于包是一个文件夹,里面存放了很多的.Java文件,一个.Java文件对应一个类。

5.2 导入包中的类

这里我们可以用到import关键字进行导入包,也成为打包。例如:

import java.util.Arrays;

java.util就是包的名字,而Arrays就是类名。

当然我们也可以不导入包直接在代码中使用,如下:

        int[] a = new int[]{6,4,2,1};java.util.Arrays.sort(a);System.out.println(java.util.Arrays.toString(a));

但是这样书写太麻烦了,但是当两个包里面有相同名字的类都被使用的时候就需要这样去写。

当然还有一种写法是: *叫做通配符

import java.util.*;

不同的包里面可以有相同的类名,这两个类只是名字相同,但是作用不相同。 

        这种方法可以导入包里面的全部类,但是不建议这样书写。因为有可能在两个包里面会有相同名字的类,这样书写就会导致冲突,编译器会报错。

在java.util包里面有一个Date的类,在java.sql包里面也有一个Date的类,如果书写成如下格式就会报错:

因为这样的话,在代码中使用时,编译器无法识别是哪一个包下面的类,所以遇到这种情况,只能用import导入一个类,另一个类则需要在使用的时候进行导入。如图:

import java.util.Date;Date date = new Date();
java.sql.Date date1 = new java.sql.Date(10);

5.3 自定义包

创建一个包:

包的命必须是字母,数字,点号,下划线,数字不能开头,不能包含关键字。

一般公司命名是以 com.公司名.项目名.模块名 来命名的。

回车后就创建好了一个包:

 com是一级目录,abc是二级目录,www是三级目录。Test1是类。

Test1类里面代码如下:

package com.abc.www;public class Test1 {public void test1() {System.out.println("haha");}
}

package是编译器自己生成的,为了声明该类在那个包里面。

下面我自己编写了一段代码。

如果要在其他类中调用自定义包里面的方法,就是如下图:

import com.abc.www.Test1;public class Test {public static void main(String[] args) {Test1 test1 = new Test1();test1.test1();}
}

这样就可以调用了,com.abc.www是包名,Test1是类名,test1是类里面的方法。

5.4 常用的包

java.lang    lang是基本包,默认引入的,不需要再导入。

java.util      系统提供的工具包,包含工具类。

java.net      网络开发用的。

java.awt   做Java的页面开发的。

6. static关键字

static是用来修饰成员的,被static修饰的成员叫做静态成员,也叫做类成员,表示该成员不属于任何一个对象的,而是所有对象共同包含成员。我用下面的代码帮助大家理解:

class Student{public String name;public int age;public String stuNum;public static String classNum;public Student(String name, int age, String stuNum) {this.name = name;this.age = age;this.stuNum = stuNum;}
}
public class Test {public static void main(String[] args) {Student student1 = new Student("张三",18,"202311");Student student2 = new Student("李四",19,"202312");}
}

此时学生1和学生2这两个对象都在同一个班级,那么班级属性是两个对象都一样的,就可以被static修饰。

6.1 static修饰成员变量

当static修饰完成员变量后,该成员变量就属于类的变量,而不是方法的变量,此时该静态变量就不会在根据类的定义在堆区申请的对象的内存空间中了,而是在方法区中了。如下图所示关系:

此时我们如何访问静态变量呢?

有两种方式:

Student student1 = new Student("张三",18,"202311");
//通过对象的引用来访问
student1.classNum = "1班";
//通过类名访问
Student.classNum = "1班";

第一种是通过对象的引用来访问,但是不建议使用,因为静态变量不在对象申请的内存中,在方法区中,属于类的变量。

第二种是通过类名来访问。

注意:

  • 静态变量的访问不依赖于对象,不需要实例化对象,就可以直接访问。
  • 类变量存储在方法区中。
  • 类变量的生命周期是整个类的生命周期。
  • 静态变量是所有对象共享的,不存在于某个对象的空间里。

6.2 static修饰成员方法

static修饰成员方法后,成员方法变成静态成员方法,静态成员变量的访问不依赖于对象,属于类方法,存在于方法区,有两种访问方式:

class Student {public String name = "张三";public int age = 18;public String sex = "男";public static void print() {System.out.println("hehe");}
}
public class Test1 {public static void main(String[] args) {//方法一Student student = new Student();student.print();//方法二Student.print();}
}

方法一:是通过对象来访问,这种方法虽然不会报错,但是不建议使用,因为静态方法属于类方法,不依赖于对象。

方法二:直接通过类名访问,这种方法建议使用。

注意:

  • 静态方法里面不能使用this关键字,因为this关键字依赖于对象,而静态方法的访问不依赖于对象。
  • 静态方法不能直接访问非静态方法和非静态变量,但可以通过对象的实例化间接访问。
  • 非静态方法可以直接访问静态方法和静态变量,非静态方法依赖于对象,静态方法和静态变量不依赖于对象。
  • 不同类间访问静态方法或静态变量,通过类名.方法名或变量名访问。
  • 不同类间访问非静态方法或非静态变量,对象实例化后,通过对象来访问。
  • static不能修饰局部变量。

6.3 Static修饰成员变量初始化

静态成员方法初始化方法有四种:

  1. 通过就地初始化,也就是直接初始化值。
  2. 通过set方法初始化。
  3. 通过构造方法初始化。
  4. 通过静态代码块初始化

7. 代码块

代码块是指被{}包含的内容,一般情况下是用来对成员变量进行初始化的。分为三种:

7.1 普通代码块

这是定义在方法内的代码块:

    public static void main(String[] args) {//普通代码块{int a = 10;System.out.println(a);}}

7.2 构造代码块

定义在类里面的代码块,也叫做实例代码块。用来初始化非静态成员变量的,在实例化对象的时候执行:

class Student {public String name = "张三";public int age = 18;public static String sex = "男";//实例代码块{name = "李四";age = 20;}
}

7.3 静态代码块

定义在类里面的代码块,用来初始化静态成员变量的,在类加载的时候执行:

class Student {public String name = "张三";public int age = 18;public static String sex = "男";//静态代码块{sex = "女";}
}

静态代码块只能初始化静态成员变量。因为非静态对象初始化依赖于对象。 

7.4 各种初始化

我们已经知道了 用构造方法来初始化成员变量,还有就地初始化成员变量,还有代码块初始化成员变量,代码块又分为静态代码块和实例代码块。

那它们的执行先后顺序又是怎样的呢?

多个静态代码块或者多个实例代码块同时初始化,则是按照代码的先后顺序初始化。

静态代码块是在类加载时执行的,而构造方法和实例初始化则是在实例化对象时执行的,所以静态代码块先执行,如果有静态变量就地初始化,会按照先后顺序进行执行,而实例初始化比构造方法先执行。

一般成员变量的定义和初始化先写,在写其他的代码块或者方法。

执行顺序为:就地初始化->静态代码块->实例代码块->构造方法。

        如果实例化多个对象时,由于类只会在第一次实例化对象时加载一次,也就是说静态代码块只执行一次,第二次实例化对象时,不执行静态代码块,只执行实例代码块和构造方法。

8. 对象的打印

如果想打印对象的属性也就是成员变量有什么快捷方式吗?

这里idea提供了一种快捷方式,生成toString方法来进行打印:

class Student {public String name = "张三";public int age = 18;public String sex = "男";//打印成员变量的方法:@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", sex='" + sex + '\'' +'}';}
}public class Test1 {public static void main(String[] args) {Student student = new Student();System.out.println(student);}
}

打印结果如下:

这样就可以实现快速打印对象的属性。

如果不写toString方法,默认打印的是地址。当然这种快捷方式不能生成静态成员变量。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/82195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Axure元件动作五:设置列表选中项

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!如有帮助请订阅专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 演示视频: Axure设置列表选中项 课程主题:设置列表选中项 主要内容:下拉列表选项、值、变量值、焦…

Spring框架--IOC技术

一、Spring框架的介绍 1、Spring框架的概述 Spring 是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003年兴起的一个轻量级的Java开发框架,由 Rod Jo…

Flannel后端为UDP模式下,分析数据包的发送方式——tun设备(三)

在分析 Kubernetes 环境中 Flannel UDP 模式的数据包转发时,我们提到 flannel.1 是一个 TUN 设备,它在数据包处理中起到了关键作用。 什么是 TUN 设备? TUN 设备(Tunnel 设备)是 Linux 系统中一种虚拟网络接口&#x…

2025深圳国际无人机展深度解析:看点、厂商与创新亮点

2025深圳国际无人机展深度解析:看点、厂商与创新亮点 1.背景2.核心看点:技术突破与场景创新2.1 eVTOL(飞行汽车)的规模化展示2.2 智能无人机与无人值守平台2.3 新材料与核心零部件革新2.4 动态演示与赛事活动 3.头部无人机厂商4.核…

【Jitsi Meet】(腾讯会议的平替)Docker安装Jitsi Meet指南-使用内网IP访问

Docker安装Jitsi Meet指南-使用内网IP访问 下载官方代码配置环境变量复制示例环境文件并修改配置:编辑 .env 文件: 修改 docker-compose.yml 文件生成自签名证书启动服务最终验证 腾讯会议的平替。我们是每天开早晚会的,都是使用腾讯会议。腾…

使用Spring Boot和Spring Security结合JWT实现安全的RESTful API

使用Spring Boot和Spring Security结合JWT实现安全的RESTful API 引言 在现代Web应用中,安全性是至关重要的。Spring Boot和Spring Security提供了强大的工具来保护我们的应用程序,而JWT(JSON Web Token)则是一种轻量级的认证和…

对神经正切核的理解和推导(1)

声明: 本文是对Neural Tangent Kernel (NTK)基础推导 - Gearlesskai - 博客园文章内容的理解与推导,里面很多东西对我这种新手来说不太好理解,所以我力求通过这种方式理解文章的大部分内容。希望我的理解可以帮助你更…

基于 STC89C52 的养殖场智能温控系统设计与实现

摘要 本文提出一种基于 STC89C52 单片机的养殖场环境温度智能控制系统,通过集成高精度温度传感器、智能执行机构及人机交互模块,实现对养殖环境的实时监测与自动调控。系统具备温度阈值设定、超限报警及多模式控制功能,可有效提升养殖环境稳定性,降低能耗与人工成本。 一…

微信小程序调试

一、寻找答案 1. 创建小程序 https://zhuanlan.zhihu.com/p/1906013675883561860 2. 若有后端接口,需要调试 https://blog.csdn.net/animatecat/article/details/126949749 3. 比较细教程, 搭建修改配置 https://zhuanlan.zhihu.com/p/1893281527112136235 4. 查找…

使用DeepSeek实现数据处理

一、核心能力全景图 Ctrl+/ 唤醒智能助手,支持以下数据处理场景: 🧹 数据清洗与预处理📈 统计分析与可视化🤖 机器学习建模🚀 大数据性能优化📊 自动化报告生成⚡ 实时流数据处理二、高频场景实战(附魔法口令) 场景1:数据清洗自动化(Python示例) 口令: 处…

符合Python风格的对象(使用 __slots__ 类属性节省空间)

使用__slots__ 类属性节省空间 默认情况下,Python 在各个实例中名为__dict__ 的字典里存储实例属 性。如 3.9.3 节所述,为了使用底层的散列表提升访问速度,字典会消 耗大量内存。如果要处理数百万个属性不多的实例,通过__slots__…

民宿管理系统5

管理员管理&#xff1a; 新增管理员信息&#xff1a; 前端效果&#xff1a; 前端代码&#xff1a; <body> <div class"layui-fluid"><div class"layui-row"><div class"layui-form"><div class"layui-form-i…

​腾讯地图轨迹云:重构位置管理的数字神经中枢

——从轨迹追踪到智能决策&#xff0c;开启产业互联网新篇章 在数字经济与实体经济深度融合的今天&#xff0c;位置服务已成为企业数字化转型的核心基础设施。无论是物流运输中的车辆调度、共享经济中的设备管理&#xff0c;还是智慧城市中的交通优化&#xff0c;精准的轨迹数…

rce命令执行原理及靶场实战(详细)

2. 原理 在根源上应用系统从设计上要给用户提供一个指定的远程命令操作的接口。漏洞主要出现在常见的路由器、防火墙、入侵检测等设备的web管理界面上。在管理界面提供了一个ping服务。提交后&#xff0c;系统对该IP进行ping&#xff0c;并且返回结果。如果后台服务器并没有对…

GeoTools 将 Shp 导入PostGIS 空间数据库

前言 ❝ GeoTools 在空间数据转换处理方面具有强大的能力&#xff0c;能够高效、简洁的操纵 Shp 数据。特别是与空间数据库PostGIS 相结合&#xff0c;更能展示出其空间数据处理的优势&#xff0c;借助 GeoTools&#xff0c;我们可以实现 Shp 数据高效入库。 本文上接系列文章 …

基于SpringBoot+Vue的家政服务系统源码适配H5小程序APP

市场前景 随着社会经济的发展和人口老龄化的加剧&#xff0c;家政服务需求不断增长。我国65岁及以上人口增长较快&#xff0c;2022年我国65岁及以上老年人数量达2.1亿人&#xff0c;占比较2016年增长4.1个百分点&#xff0c;达14.9%。我国65岁及以上人口数量庞大&#xff0c;老…

《企业级日志该怎么打?Java日志规范、分层设计与埋点实践》

大家好呀&#xff01;&#x1f44b; 今天我们要聊一个Java开发中超级重要但又经常被忽视的话题——日志系统&#xff01;&#x1f4dd; 不管你是刚入门的小白&#xff0c;还是工作多年的老司机&#xff0c;日志都是我们每天都要打交道的"好朋友"。那么&#xff0c;如…

1Panel vs 宝塔面板:现代化运维工具的全方位对比

1Panel vs 宝塔面板对比分析 1Panel 和 宝塔面板&#xff08;BT-Panel&#xff09;都是服务器管理工具&#xff0c;旨在简化 Linux 服务器的运维工作&#xff0c;但它们在设计理念、功能侧重点和技术实现上有明显差异。以下从多个维度对两者进行对比分析&#xff1a; 1. 定位与…

怎么开发一个网络协议模块(C语言框架)之(四) 信号量初始化

// 原始代码 /* gVrrpInstance.sem = OsixCreateBSem(OSIX_SEM_Q_PRIORITY, OSIX_SEM_FULL); */ gVrrpInstance.sem = OsixCreateMSem(OSIX_SEM_Q_FIFO | OSIX_SEM_DELETE_SAFE); if (gVrrpInstance.sem == NULL) {printf("[VRRP]:vrrp init error, failed to create vrrp…

电脑C盘清理技巧:释放空间,提升性能

文章目录 一、使用系统自带的磁盘清理工具&#xff08;一&#xff09;打开磁盘清理工具&#xff08;二&#xff09;清理临时文件&#xff08;三&#xff09;清理系统文件 二、使用第三方清理工具&#xff08;一&#xff09;CCleaner&#xff08;极力推荐&#xff09;&#xff0…