【Java】面向对象程序三板斧——如何优雅设计包、封装数据与优化代码块?

在这里插入图片描述

🎁个人主页:User_芊芊君子
🎉欢迎大家点赞👍评论📝收藏⭐文章
🔍系列专栏:【Java】内容概括

在这里插入图片描述
在这里插入图片描述
【前言】

在Java编程中,类和对象是面向对象编程的核心概念。而包(Package)、封装(Encapsulation)以及代码块(Code Block)作为重要的语言特性,在组织代码结构、保障数据安全和控制代码执行流程等方面发挥着关键作用。本文将通过详细的代码示例和图解,带大家深入理解这些特性。

文章目录:

  • 一、包(Package)——代码的“收纳盒”
    • 1.定义
    • 2.导入包中的类
    • 3.自定义包
      • 3.1 基本规则
      • 3.2 使用 IDEA 创建包过程
      • 3.3 常见的包
      • 3.4 包访问权限
  • 二、封装
    • 1. 什么是封装
    • 2. 代码演示
    • 3. 封装的好处:
    • 4. 访问限定符详解
  • 三、static 关键字
    • 1. static 修饰成员变量
    • 2. 静态成员变量的访问
    • 3. static 修饰成员方法
    • 4.static 成员变量的初始化
  • 四、代码块
    • 1.普通代码块
    • 2.构造代码块
    • 3.静态代码块

一、包(Package)——代码的“收纳盒”

1.定义

  • (Package)是Java中⼀个组织类的⽅式,⽤于防⽌类名冲突和提⾼代码的可读性。包允许将类组织在⼀个层次结构中,类似于⽂件系统中的⽬录。
  • 包是对类、接⼝等的封装机制的体现,是⼀种对类或者接⼝等的很好的组织⽅式。类似于文件夹

2.导入包中的类

Java 中已经提供了很多现成的类供我们使⽤,例如Date类:可以使⽤java.util.Date导⼊java.util 这个包中的 Date 类.
方法一:写全路径导入

public class Test {public static void main(String[] args) {java.util.Date date = new java.util.Date();System.out.println(date.getTime());}
}

方法二:使用import导入

 java.util.Date date = new java.util.Date();

上面的写法就比较麻烦了,我们可以直接使用import导入包

import java.util.Date;public class Test {public static void main(String[] args) {// java.util.Date date = new java.util.Date();Date date = new Date();System.out.println(date.getTime());}
}

快捷方式:输入Date,回车即可

方法三:使用 import java.util.*导入,就可以使用java.util中的其他类

import java.util.*;public class Test {public static void main(String[] args) {// java.util.Date date = new java.util.Date();Date date = new Date();System.out.println(date.getTime());}
}

建议显示的指定要导入的类名,否则容易出现冲突,如下图:当有两个包都有Date类时,编译器就不知道该引入哪个包中的类了

在这里插入图片描述
在这里插入图片描述

3.自定义包

3.1 基本规则

  • 在⽂件的最上⽅加上⼀个 package 语句指定该代码在哪个包中.
  • 包名需要尽量指定成唯⼀的名字, 通常会⽤公司的域名的颠倒形式(例如 com.bit.demo1 ).
  • 包名要和代码路径相匹配. 例如创建com.bit.demo1 的包, 那么会存在⼀个对应的路径com/bit/demo1 来存储代码.
  • 如果⼀个类没有 package 语句, 则该类被放到⼀个默认包中.

3.2 使用 IDEA 创建包过程

  • 在 IDEA 中先新建⼀个包: 右键 src -> 新建 -> 包
    注意:包名要小写
    在这里插入图片描述
  • 输入包名
    在这里插入图片描述
  • 出现 Package 语句
package com.bit.demo1;public class TestDame {
}

3.3 常见的包

  • java.lang:系统常⽤基础类(String、Object),此包从JDK1.1后⾃动导⼊。
  • java.lang.reflect:java 反射编程包;
  • java.net:进⾏⽹络编程开发包。
  • java.sql:进⾏数据库开发的⽀持包。
  • java.util:是java提供的⼯具程序包。(集合类等) ⾮常重要
  • java.io:I/O编程开发包。

3.4 包访问权限

如果我们在定⼀个类的时候,如果没有指定成员变量/成员⽅法的访问权限,此时默认的访问权限就是包访问权限

package com.bit.demo1;public class Computer {private String cpu;   //cpuprivate String memory;//内存public String screen; //屏幕String brand;         //品牌   包访问权限public Computer(String brand,String cpu,String memory,String screen){this.brand = brand;this.cpu = cpu;this.memory = memory;this.screen = screen;}public void Boot(){System.out.println("开机~~~");}public void PowerOff(){System.out.println("关机~~~");}public void SurfInternet(){System.out.println("上网~~~");}
}
package com.bit.dame2;import com.bit.demo1.Computer;import javax.swing.*;public class Tes {public static void main(String[] args) {Computer computer = new Computer("华为","英特尔","8G","三星");System.out.println(computer.brand);System.out.println(computer.screen);System.out.println(computer.cpu);System.out.println(computer.memory);}
}
  • public 修饰符

public修饰的成员在哪里都能访问,它的权限是最大的

 public String screen; //屏幕
 System.out.println(computer.screen);
  • private 修饰符

只能在当前类中使用

  • 默认修饰符

只能在dema1包中使用

在这里插入图片描述

二、封装

1. 什么是封装

  • ⾯向对象程序三⼤特性:封装、继承、多态。⽽类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说就是套壳屏蔽细节
  • 封装就像是把东西放在⼀个盒⼦⾥,并且控制谁可以打开这个盒⼦,以及如何使⽤盒⼦⾥的东西。在编程中,它指的是将数据(属性)和操作这些数据的⽅法(函数)包装在⼀个单元(通常是类)内
  • ⽐如:对于电脑这样⼀个复杂的设备,提供给⽤⼾的就只是:开关机、通过键盘输⼊,显⽰器,USB插孔等,让⽤⼾来和计算机进⾏交互,完成⽇常事务。
  • 对于计算机使⽤者⽽⾔,不⽤关⼼内部核⼼部件,⽐如主板上线路是如何布局的,CPU内部是如何设计的等,⽤⼾只需要知道,怎么开机、怎么通过键盘和⿏标与计算机进⾏交互即可。因此计算机⼚商在出⼚时,在外部套上壳⼦,将内部实现细节隐藏起来,仅仅对外提供开关机、⿏标以及键盘插孔等,让⽤⼾可以与计算机进⾏交互即可。
  • 封装:将数据和操作数据的⽅法进⾏有机结合,隐藏对象的属性和实现细节,仅对外公开接⼝来和对象进⾏交互

2. 代码演示

package com.bit.demo1;public class Computer {private String cpu;   //cpuprivate String memory;//内存public String screen; //屏幕String brand;         //品牌   包访问权限public Computer(String brand,String cpu,String memory,String screen){this.brand = brand;this.cpu = cpu;this.memory = memory;this.screen = screen;}public String getCpu() {return cpu;}public void setCpu(String cpu) {this.cpu = cpu;}public String getMemory() {return memory;}public void setMemory(String memory) {this.memory = memory;}public void Boot(){System.out.println("开机~~~");}public void PowerOff(){System.out.println("关机~~~");}public void SurfInternet(){System.out.println("上网~~~");}
}
package com.bit.dame2;import com.bit.demo1.Computer;import javax.swing.*;public class Tes {public static void main(String[] args) {Computer computer = new Computer("华为","英特尔","8G","三星");System.out.println(computer.getCpu());System.out.println(computer.screen);System.out.println(computer.getMemory());}
}

通过private对Computer中的成员变量进行隐藏,但是可以提供get或者set方法,让内外进行交互(这里编译器也可以自动生成),方法如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 封装的好处:

  1. 降低代码的耦合性
    封装可以降低对象和对象之间的耦合度,当对象内部发⽣变化时,只需要修改对象内部即可,不会影 响到外部程序,因为公开的接⼝是不会发⽣改变的
  2. 降低代码的复杂性
    封装是隐藏了对象内部的实现细节,只提供了公开的接⼝给外部,使⽤起来更加简单
  3. 提⾼安全性
    封装可以隐藏对象的具体实现细节,阻⽌外部程序直接访问对象的内部状态,从⽽保护数据不被意外 修改或破坏

4. 访问限定符详解

Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的⽅法结合在⼀起,更符合⼈类对事物的认知,⽽访问权限⽤来控制⽅法或者字段能否直接在类外使⽤。Java中提供了四种访问限定符:

• public修饰的成员变量,在所指定情况下均是可以正常访问的
• private修饰的成员变量,只能在当前类中来使⽤
• default表⽰什么修饰符都不加,此时只能在包当中才能被访问

三、static 关键字

1. static 修饰成员变量

在Java中,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对象,是所有对象所共享的

创建一个Student 类,其中包含两名学生的姓名,年龄和班级(一样),这时就可以用static修饰班级,如下代码:

package demo;public class Student {public String name;public int age;public static String classRoom;//静态}
package demo;public class Test {public static void main(String[] args) {Student.classRoom = "1";Student student1 = new Student();student1.name = "lisa";student1.age  = 18;Student student2 = new Student();student2.name = "baby";student2.age = 20;System.out.println(Student.classRoom);}
}

执行结果:
在这里插入图片描述

【静态成员变量特性】

  1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
  2. 既可以通过对象访问,也可以通过类名访问,但⼀般更推荐使⽤类名访问
  3. 类变量存储在⽅法区当中
  4. ⽣命周期伴随类的⼀⽣(即:随类的加载⽽创建,随类的卸载⽽销毁)

2. 静态成员变量的访问

类名.静态成员变量的⽅式进⾏访问

 System.out.println(Student.classRoom);

3. static 修饰成员方法

Java中,被static修饰的成员⽅法称为静态成员⽅法,是类的⽅法,不是某个对象所特有的。静态成员⼀般是通过静态⽅法来访问的。

public static String getClassRoom(){return classRoom;}
System.out.println(Student.getClassRoom());

【静态⽅法特性】

  1. 不属于某个具体的对象,是类⽅法
  2. 可以通过对象调⽤,也可以通过类名.静态⽅法名(…)⽅式调⽤,更推荐使⽤后者
  3. 不能在静态⽅法中访问任何⾮静态成员变量
  4. 静态⽅法中不能调⽤任何⾮静态⽅法,因为⾮静态⽅法有this参数,在静态⽅法中调⽤时候⽆法传 递this引⽤
 public  void doClass(){System.out.println("学习");}public static String getClassRoom(){doClass();}

在这里插入图片描述

4.static 成员变量的初始化

就地初始化
在定义时直接给出初始值

pubilc class Student{private String name;private static String classRoom = "1"

四、代码块

使⽤ {} 定义的⼀段代码称为代码块

• 普通代码块
• 构造块(实例代码块)
• 静态块
• 同步代码块(

1.普通代码块

普通代码块就是定义在方法中的代码块

public static void main(String[] args) {int a = 0;System.out.println(a);}

2.构造代码块

定义在类中的代码块,也叫实例代码块,一般用于初始化实例成员变量

public class Student {//实例代码块{this.name = "lisi";this.age = 18;System.out.println("实例代码块执行");}
public class Test {public static void main(String[] args) {Student student1 = new Student();System.out.println(student1.name);System.out.println(student1.age);}

执行结果
在这里插入图片描述
【执行顺序】

  • 先执行实例代码块,再执行对应的构造方法
  • 实例成员变量与实例代码块,谁在前先执行谁
  • 当有静态代码块时,先执行静态代码块,再执行实例代码块

3.静态代码块

使⽤static定义的代码块称为静态代码块。⼀般⽤于初始化静态成员变量。

public class Student {//实例代码块{this.name = "lisi";this.age = 18;System.out.println("实例代码块执行");}//静态代码块static {System.out.println("静态代码块被执行");}public class Test {public static void main(String[] args) {Student student1 = new Student();System.out.println(student1.name);System.out.println(student1.age);}

执行结果
在这里插入图片描述

注意事项
• 静态代码块不管⽣成多少个对象,其只会执⾏⼀次
• 静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
• 如果⼀个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执⾏(合并)
• 实例代码块只有在创建对象时才会执⾏

【总结】

  • 包管理:遵循反向域名命名,合理划分模块
  • 封装设计:属性私有,方法公开,增加数据校验
  • 代码块使用:静态代码块用于类级初始化,实例代码块简化构造逻辑 通过掌握这些特性,开发者能够编写出结构清晰、安全可靠的Java程序。希望本文的示例和解析能帮助你更好地理解和应用这些核心概念!
    如果对某个知识点有疑问,欢迎在评论区留言交流! 🚀

在这里插入图片描述

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

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

相关文章

玩转Docker | 使用Docker搭建Blog微博系统

玩转Docker | 使用Docker搭建Blog微博系统 前言一、Blog介绍项目简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署Blog服务下载镜像创建容器检查容器状态设置权限检查服务端口安全设置四、访问Blog系统访问Blog首页登录Blog五、总结前言 在数字…

用Java NIO模拟HTTPS

HTTPS流程 名词解释: R1:随机数1 R2:随机数2 R3:随机数3 publicKey:公钥 privateKey:私钥 要提供https服务,服务端需要安装数字证书,在(TCP建立连接之后)TLS握手时发给客户端,客户端验证证书&#x…

树莓派_利用Ubuntu搭建gitlab

树莓派_利用Ubuntu搭建gitlab 一、给树莓派3A搭建基本系统 1、下载系统镜像 https://cdimage.ubuntu.com/ubuntu/releases/18.04/release/ 2、准备系统SD卡 二、给树莓派设备联网 1、串口后台登录 使用串口登录后台是最便捷的,因为前期网络可能不好直接成功 默…

Hook_Unfinished

#include <windows.h>// 假设这两个函数是存在的 void DoRD() {} void 改堆栈cal1() {} void 改回堆栈cal1() {}__declspec(naked) void HOOKcall() {__asm{pushadnop}__asm{popadmov eax, dword ptr [esi 8]sub eax, ecxretn} }int main() {// 第一个 Hook 操作DWORD H…

数据结构(六)——红黑树及模拟实现

目录 前言 红黑树的概念及性质 红黑树的效率 红黑树的结构 红黑树的插入 变色不旋转 单旋变色 双旋变色 插入代码如下所示&#xff1a; 红黑树的查找 红黑树的验证 红黑树代码如下所示&#xff1a; 小结 前言 在前面的文章我们介绍了AVL这一棵完全二叉搜索树&…

c# 数据结构 链表篇 有关双向链表的一切

本人能力有限,如有不足还请斧正 目录 0.双向链表的好处 1.双向链表的分类 2.不带头节点的标准双向链表 节点类:有头有尾 链表类:也可以有头有尾 也可以只有头 增 头插 尾插 删 查 改 遍历 全部代码 3.循环双向链表 节点类 链表类 增 头插 尾插 删 查 遍历…

Numba 从零基础到实战:解锁 Python 性能新境界

Numba 从零基础到实战&#xff1a;解锁 Python 性能新境界 一、引言 在 Python 的世界里&#xff0c;性能一直是一个备受关注的话题。Python 以其简洁易读的语法和丰富的库生态&#xff0c;深受开发者喜爱&#xff0c;但在处理一些计算密集型任务时&#xff0c;其执行速度往往…

单位门户网站被攻击后的安全防护策略

政府网站安全现状与挑战 近年来&#xff0c;随着数字化进程的加速&#xff0c;政府门户网站已成为政务公开和服务公众的重要窗口。然而&#xff0c;网络安全形势却日益严峻。国家互联网应急中心的数据显示&#xff0c;政府网站已成为黑客攻击的重点目标&#xff0c;被篡改和被…

Spring Boot 项目三种打印日志的方法详解。Logger,log,logger 解读。

目录 一. 打印日志的常见三种方法&#xff1f; 1.1 手动创建 Logger 对象&#xff08;基于SLF4J API&#xff09; 1.2 使用 Lombok 插件的 Slf4j 注解 1.3 使用 Spring 的 Log 接口&#xff08;使用频率较低&#xff09; 二. 常见的 Logger&#xff0c;logger&#xff0c;…

NI的LABVIEW工具安装及卸载步骤说明

一.介绍 最近接到个转交的项目&#xff0c;项目主要作为上位机工具开发&#xff0c;在对接下位机时&#xff0c;有用到NI的labview工具。labview软件是由美国国家仪器&#xff08;NI&#xff09;公司研制开发的一种程序开发环境&#xff0c;主要用于汽车测试、数据采集、芯片测…

cmd 终端输出乱码问题 |Visual Studio 控制台输出中文乱码解决

在网上下载&#xff0c;或者移植别人的代码到自己的电脑&#xff0c;使用VS运行后&#xff0c;控制台输出中文可能出现乱码。这是因为源代码的编码格式和控制台的编码格式不一致。 文章目录 查看源代码文件编码格式查看输出控制台编码格式修改编码格式修改终端代码页 补充总结 …

A009-基于pytest的网易云自动化测试

题 目 :基于pytest的网易云自动化测试 主要内容 综合应用所学的软件测试理论和方法,实现网易云的功能自动化测试。 (1)自动化测试介绍; (2)自动化功能测试框架介绍; (3)设计功能测试用例 (4)书写自动化测试脚本; (5)测试评价与结论。 任务要求 (1)能…

LVGL Video控件和Radiobtn控件详解

LVGL Video控件和Radiobtn控件详解 一、 Video控件详解1. 概述2. 创建和初始化3. 基本属性设置4. 视频控制5. 回调函数6. 高级功能7. 注意事项 二、Radiobtn控件详解1. 概述2. 创建和初始化3. 属性设置4. 状态控制5. 组管理6. 事件处理7. 样式设置8. 注意事项 三、效果展示四、…

AbortController:让异步操作随时说停就停

AbortController&#xff1a;让异步操作随时说停就停 一、什么是 AbortController&#xff1f; AbortController 是 JavaScript 在浏览器和部分 Node.js 环境中提供的全局类&#xff0c;用来中止正在进行或待完成的异步操作&#xff08;如 fetch() 请求、事件监听、可写流、数…

机器学习 从入门到精通 day_04

1. 决策树-分类 1.1 概念 1. 决策节点 通过条件判断而进行分支选择的节点。如&#xff1a;将某个样本中的属性值(特征值)与决策节点上的值进行比较&#xff0c;从而判断它的流向。 2. 叶子节点 没有子节点的节点&#xff0c;表示最终的决策结果。 3. 决策树的…

C++ Primer (第五版)-第十三章 拷贝控制

文章目录 概述13.1拷贝、赋值与销毁合成拷贝构造函数拷贝初始化参数和返回值拷贝初始化的限制编译器可以绕过拷贝构造函数拷贝运算符析构函数三/五原则使用default阻止拷贝合成的拷贝控制成员可能是删除的 private拷贝控制拷贝控制和资源管理行为像值的类类值拷贝赋值运算符定义…

Vue el-from的el-form-item v-for循环表单如何校验rules(一)

实际业务需求场景&#xff1a; 新增或编辑页面&#xff08;基础信息表单&#xff0c;一个数据列表的表单&#xff09;&#xff0c;数据列表里面的表单数是动态添加的。数据可新增、可删除&#xff0c;在表单保存前&#xff0c;常常需要做表单必填项的校验&#xff0c;校验通过以…

测试100问:http和https的区别是什么?

哈喽&#xff0c;大家好&#xff0c;我是十二&#xff0c;今天给大家分享的问题是&#xff1a;http和https的区别是什么&#xff1f; 首先我们要知道 HTTP 协议传播的数据都是未加密的&#xff0c;也就是明文的&#xff0c;因此呢使用 http协议传输一些隐私信息也就非常不安全&…

YOLOv3超详细解读(三):源码解析:数据处理模块

一、概述 YOLOv3&#xff08;You Only Look Once v3&#xff09;是一种高效的目标检测算法&#xff0c;其数据处理模块是训练和推理流程的核心部分。本文将深入分析Ultralytics团队基于PyTorch实现的YOLOv3源码中的数据处理模块&#xff0c;重点探讨数据加载、预处理和数据增强…

每日算法(双指针算法)(Day 1)

双指针算法 1.算法题目&#xff08;移动零&#xff09;2.讲解算法原理3.编写代码 1.算法题目&#xff08;移动零&#xff09; 2.讲解算法原理 数组划分&#xff0c;数组分块&#xff08;快排里面最核心的一步&#xff09;只需把0改为tmp 双指针算法&#xff1a;利用数组下标来…