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

【Java】面向对象程序三板斧——如何优雅设计包、封装数据与优化代码块?
在这里插入图片描述
🎁个人主页:User_芊芊君子
🎉欢迎大家点赞👍评论📝收藏⭐文章
🔍系列专栏:【Java】内容概括
在这里插入图片描述


在这里插入图片描述


【前言】

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

文章目录:

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

1.定义

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

2.导入包中的类

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

publicclassTest{publicstaticvoidmain(String[] args){java.util.Date date =newjava.util.Date();System.out.println(date.getTime());}}

方法二:使用import导入

java.util.Date date =newjava.util.Date();
上面的写法就比较麻烦了,我们可以直接使用import导入包
importjava.util.Date;publicclassTest{publicstaticvoidmain(String[] args){// java.util.Date date = new java.util.Date();Date date =newDate();System.out.println(date.getTime());}}
快捷方式:输入Date,回车即可

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

importjava.util.*;publicclassTest{publicstaticvoidmain(String[] args){// java.util.Date date = new java.util.Date();Date date =newDate();System.out.println(date.getTime());}}
建议显示的指定要导入的类名,否则容易出现冲突,如下图:当有两个包都有Date类时,编译器就不知道该引入哪个包中的类了
在这里插入图片描述


在这里插入图片描述

3.自定义包

3.1 基本规则

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

3.2 使用 IDEA 创建包过程

  • 出现 Package 语句

输入包名

在这里插入图片描述

在 IDEA 中先新建⼀个包: 右键 src -> 新建 -> 包
注意:包名要小写

在这里插入图片描述
packagecom.bit.demo1;publicclassTestDame{}

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 包访问权限

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

packagecom.bit.demo1;publicclassComputer{privateString cpu;//cpuprivateString memory;//内存publicString screen;//屏幕String brand;//品牌 包访问权限publicComputer(String brand,String cpu,String memory,String screen){this.brand = brand;this.cpu = cpu;this.memory = memory;this.screen = screen;}publicvoidBoot(){System.out.println("开机~~~");}publicvoidPowerOff(){System.out.println("关机~~~");}publicvoidSurfInternet(){System.out.println("上网~~~");}}
packagecom.bit.dame2;importcom.bit.demo1.Computer;importjavax.swing.*;publicclassTes{publicstaticvoidmain(String[] args){Computer computer =newComputer("华为","英特尔","8G","三星");System.out.println(computer.brand);System.out.println(computer.screen);System.out.println(computer.cpu);System.out.println(computer.memory);}}
  • public 修饰符
public修饰的成员在哪里都能访问,它的权限是最大的
publicString screen;//屏幕
System.out.println(computer.screen);
  • private 修饰符
只能在当前类中使用
  • 默认修饰符
只能在dema1包中使用
在这里插入图片描述

二、封装

1. 什么是封装

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

2. 代码演示

packagecom.bit.demo1;publicclassComputer{privateString cpu;//cpuprivateString memory;//内存publicString screen;//屏幕String brand;//品牌 包访问权限publicComputer(String brand,String cpu,String memory,String screen){this.brand = brand;this.cpu = cpu;this.memory = memory;this.screen = screen;}publicStringgetCpu(){return cpu;}publicvoidsetCpu(String cpu){this.cpu = cpu;}publicStringgetMemory(){return memory;}publicvoidsetMemory(String memory){this.memory = memory;}publicvoidBoot(){System.out.println("开机~~~");}publicvoidPowerOff(){System.out.println("关机~~~");}publicvoidSurfInternet(){System.out.println("上网~~~");}}
packagecom.bit.dame2;importcom.bit.demo1.Computer;importjavax.swing.*;publicclassTes{publicstaticvoidmain(String[] args){Computer computer =newComputer("华为","英特尔","8G","三星");System.out.println(computer.getCpu());System.out.println(computer.screen);System.out.println(computer.getMemory());}}
通过private对Computer中的成员变量进行隐藏,但是可以提供get或者set方法,让内外进行交互(这里编译器也可以自动生成),方法如下:
在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

3. 封装的好处:

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

4. 访问限定符详解

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

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

三、static 关键字

1. static 修饰成员变量

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

创建一个Student 类,其中包含两名学生的姓名,年龄和班级(一样),这时就可以用static修饰班级,如下代码:
packagedemo;publicclassStudent{publicString name;publicint age;publicstaticString classRoom;//静态}
packagedemo;publicclassTest{publicstaticvoidmain(String[] args){Student.classRoom ="1";Student student1 =newStudent(); student1.name ="lisa"; student1.age =18;Student student2 =newStudent(); student2.name ="baby"; student2.age =20;System.out.println(Student.classRoom);}}

执行结果:

在这里插入图片描述
【静态成员变量特性】不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中既可以通过对象访问,也可以通过类名访问,但⼀般更推荐使⽤类名访问类变量存储在⽅法区当中⽣命周期伴随类的⼀⽣(即:随类的加载⽽创建,随类的卸载⽽销毁)

2. 静态成员变量的访问

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

System.out.println(Student.classRoom);

3. static 修饰成员方法

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

publicstaticStringgetClassRoom(){return classRoom;}
System.out.println(Student.getClassRoom());
【静态⽅法特性】不属于某个具体的对象,是类⽅法可以通过对象调⽤,也可以通过类名.静态⽅法名(…)⽅式调⽤,更推荐使⽤后者不能在静态⽅法中访问任何⾮静态成员变量静态⽅法中不能调⽤任何⾮静态⽅法,因为⾮静态⽅法有this参数,在静态⽅法中调⽤时候⽆法传 递this引⽤
publicvoiddoClass(){System.out.println("学习");}publicstaticStringgetClassRoom(){doClass();}
在这里插入图片描述

4.static 成员变量的初始化

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

pubilc classStudent{privateString name;privatestaticString classRoom ="1"

四、代码块

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

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

1.普通代码块

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

publicstaticvoidmain(String[] args){int a =0;System.out.println(a);}

2.构造代码块

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

publicclassStudent{//实例代码块{this.name ="lisi";this.age =18;System.out.println("实例代码块执行");}
publicclassTest{publicstaticvoidmain(String[] args){Student student1 =newStudent();System.out.println(student1.name);System.out.println(student1.age);}

执行结果

在这里插入图片描述


【执行顺序】

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

3.静态代码块

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

publicclassStudent{//实例代码块{this.name ="lisi";this.age =18;System.out.println("实例代码块执行");}//静态代码块static{System.out.println("静态代码块被执行");}publicclassTest{publicstaticvoidmain(String[] args){Student student1 =newStudent();System.out.println(student1.name);System.out.println(student1.age);}

执行结果

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

【总结】

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

Read more

嵌入式Linux交叉编译环境libwebkit2gtk-4.1-0安装难点解析

以下是对您提供的博文内容进行 深度润色与结构重构后的专业级技术文章 。全文已彻底去除AI生成痕迹,采用真实嵌入式工程师口吻写作,语言自然、逻辑严密、细节扎实,兼具教学性与工程实战价值。所有技术点均基于 WebKit 2.42.x + GTK 4.1 + ARM64 交叉编译一线经验提炼,无虚构信息,可直接用于团队内部知识沉淀或对外技术分享。 在 ARM 嵌入式 Linux 上稳稳跑起 libwebkit2gtk-4.1-0 :一个老司机踩坑十年才理清的交叉编译真相 “不是 WebKit 太难编,是它太认真 —— 认真到连你用的是 ARM 还是 x86 都要亲自验明正身。” 这是我在给某车企座舱项目做 Web 渲染引擎移植时,在调试日志里随手记下的一句话。那会儿我们刚把 libwebkit2gtk-4.1-0 (对应 WebKit v2.42.3)拖进

By Ne0inhk
ESP32-CAM 使用 webcam 摄像头实时查看视频

ESP32-CAM 使用 webcam 摄像头实时查看视频

0 ESP32cam 介绍 ESP32-CAM 是小尺寸的摄像头模组该模块可以作为最小系统独立工作,尺寸仅为 2740.54.5mm,可广泛应用于各种物联网场合,适用于家庭智能设备、工业无线控制、无线监控、QR 无线识别,无线定位系统信号以及其它物联网应用,是物联网应用的理想解决方案。 产品特性: * 采用低功耗双核32位CPU,可作应用处理器 * 主频高达240MHz,运算能力高达 600 DMIPS * 内置 520 KB SRAM,外置8MB PSRAM * 支持UART/SPI/I2C/PWM/ADC/DAC等接口 * 支持OV2640和OV7670摄像头,内置闪光灯 * 支持图片WiFI上传 * 支持TF卡 * 支持多种休眠模式。 * 内嵌Lwip和FreeRTOS * 支持 STA/AP/STA+AP 工作模式 * 支持 Smart

By Ne0inhk
纯QWidget绘制实现电子地图控件/非qml非web/多线程下载和加载瓦片/支持各种图形

纯QWidget绘制实现电子地图控件/非qml非web/多线程下载和加载瓦片/支持各种图形

一、前言说明 之前做的地图组件,耗费了巨大的时间精力,前后完善了五年之多,能够想到的应用场景几乎都实现了,也有不少的用户,现场实际需求也不断反馈,不断的修改和增加功能,尽管优点很多,依然有个巨大缺点就是依赖浏览器控件,性能肯定是要打折扣的,毕竟有些嵌入式板子甚至老的开发环境,不一定有浏览器控件,就算有,在嵌入式板子环境上或者一些国产硬件的系统上,配置比较低,在浏览器上运行的网页,性能指数级下降,甚至一些环境连GPU都没有,老板为了节省成本,尽量选一些配置低的板子,所以也没有一种可能用QWidget绘制来实现呢,这样性能极好,而且控制度极高,qt的painter非常灵活可靠。 经过大量的尝试改造,总算在今年实现了这个地图控件,不依赖浏览器控件,也不依赖qml,有些人用的Qt自带的qml的location组件来实现的,这个尽管方便,但是性能也低,因为嵌入式环境配置低的板子,根本无法正常跑起来qml,别提要新版的Qt才有qlocaltion组件。用qwidget来实现有两个最大难点,一个是如何将地理坐标映射到像素绘制坐标,一个是如何快速的加载瓦片多线程绘制,这个必须采用多个分层绘制的机制

By Ne0inhk
Flutter 三方库 shelf_web_socket 的鸿蒙化适配指南 - 实现具备高性能全双工长连接与协议协商能力的端侧服务端架构、支持分布式实时信令与多端协同实战

Flutter 三方库 shelf_web_socket 的鸿蒙化适配指南 - 实现具备高性能全双工长连接与协议协商能力的端侧服务端架构、支持分布式实时信令与多端协同实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 shelf_web_socket 的鸿蒙化适配指南 - 实现具备高性能全双工长连接与协议协商能力的端侧服务端架构、支持分布式实时信令与多端协同实战 前言 在进行 Flutter for OpenHarmony 开发时,当我们的鸿蒙应用需要充当“控制中心”角色(如控制智能家居、开启本地调试服务或实现 P2P 实时对抗脚本时),如何在端侧直接拉起一个支持 WebSocket 协议的高性能微服务端?shelf_web_socket 是针对 shelf 后端框架封装的一款官方级 WebSocket 处理器。本文将探讨如何在鸿蒙端构建极致、透明的长连接交互引擎。 一、原直观解析 / 概念介绍 1.1 基础原理 该库本质上是一个 shelf 处理函数(Handler)

By Ne0inhk