Java-类与对象-下篇

关于类与对象,内容较多,我们分为两篇进行讲解:

📚 Java-类与对象-上篇:————<传送门:Java-类与对象-上篇-CSDN博客>

📕 面向对象的概念

📕 类的定义格式

📕 类的使用

📕 this关键字

📕 构造方法

📚 Java-类与对象-下篇:————<就是本篇>

📕 封装(概念与访问限定符)

📕 static关键字

📕 代码块

📕 内部类

一、封装

① 封装的概念

要研究继承与多态,我们首先需要了解"封装",面向对象程序的三大特征为:封装,继承,多态。而封装面向对象中非常重要的一环,那么什么是封装呢?其实就是为了保护某种内在程序所创建的表象。

这样说可能比较抽象,封装的概念可以用以下比喻来解释

假设你有一辆汽车,它有许多复杂的部件和属性,例如发动机、轮胎、刹车等等。如果所有的这些部件和属性都暴露在外部别人可以直接操作它们那么这辆汽车可能会被错误地使用或者破坏。

而为了保护这辆汽车我们可以将其封装在一个保护壳中,只暴露一些必要的接口,例如启动引擎、加速、刹车和打开车门等等。这样,外部使用者就只能通过这些接口来操作汽车,而无法直接访问和修改汽车的内部部件。

类似地,Java中的封装就是将一个类的数据和方法封装在一起,只暴露一些必要的接口。

📌 封装的作用:

📕 可以隐藏内部实现的复杂性

📕 防止外部直接访问和修改类的内部数据

📕 我们可以控制对数据和方法的访问,并提供一些公开的接口来与外部进行交互

📕 提高代码的安全性、可维护性和实用性

② 访问限定符

既然要对某些东西进行保护,就需要界定一个可访问的范围,而"访问限定符"就具备了这种功能:

No范围privatedefaultprotectedpublic
1

同一包中

的同一类

可以可以可以可以
2

同一包中

的不同类

可以可以可以
3

不同包中

的子类

可以可以
4

不同包中

的非子类

可以

📚 让我们写段代码逐个举例进行说明:

📕 首先我们在本包本类中创建一个Test3:

📕 然后我们在本包非本类中创建一个Test4:

📕 然后我们在非本包子类中创建一个Test5:

📕 然后我们在非本包非子类中创建一个Test6:

最后我们回到Main中进行测试:

📚 注意事项:

📕 public修饰的成员可以被任何类访问

📕 如果没有明确指定访问限定符,即不加任何修饰符,成员的访问权限为默认(default)

📕 private修饰的成员只能被定义它的类访问

📕 最常用的是:public 和 private

二、static关键字

在讲static这个关键字之前,让我们回想一下之前讲到的类与对象:

我们可以通过定义学生类实例化几个学生对象,并为他们赋予独有的属性数据

但如果此时我们想将这几个学生都放入一个班级中呢难道我们还要对每一名学生都加上"班级"并赋值嘛?那太麻烦了,并且有很多相同的数据发生了重复。

而此时我们就能够使用,static它用于修饰成员变量,被称为静态成员变量,其最大的特征就是:不属于某个具体的对象,而是所有对象共享的,也就是说属于类

① 静态成员变量

📌 静态成员变量具有以下特点

📕 不论创建多少个类的实例,静态成员变量都只会分配一次内存。

📕 静态成员变量在程序运行期间始终存在,直到程序结束

📕 可以被所有的对象实例共享,一次修改将会影响到所有的对象。

📕 可以通过类名直接访问静态成员变量,也可以通过对象实例访问。

既然稍微了解了static关键字,那么让我们回到最初的问题:

将几个学生都放入一个班级中,需要进行怎样的操作可以既节省空间,又节省代码呢?

没错,我们在学生类里加一个static班级不就好了嘛~:

这样当我们再次运行代码时:

📌 这样做的好处就是:

📕 能够有效的节省内存空间

📕 不需要使用过多冗余的代码来依次定义班级

而静态成员变量的调用其实与非静态成员变量是稍微有所差别的

虽然通过成员进行访问通过类进行访问都能够成功的使用Class但是其实我们并不推荐使用成员访问因为当Class成为静态成员变量时,就代表它实质上是属于类的,而非属于类中某个成员,虽使用某个成员可以调用Class,但理论上这并不合理。

② 静态成员方法

📌 静态成员方法具有以下特点:

📕 不依赖于类的实例,可以直接通过类名调用,也可以通过对象实例调用。

📕 不能访问非静态成员变量和非静态成员方法,因为非静态成员依赖于实例的创建。

📕 可以访问静态成员变量和静态成员方法,因为它们与类关联,不依赖于实例。

📕 静态方法在类加载时就存在于内存中,并且一直存在直到程序结束。

我们可以看这三个方法,先来看第一个:

同样的,通过成员进行访问通过类进行访问Print1都能够成功的使用我们也不推荐使用成员访问因为当Print1成为静态成员方法时,就代表它实质上是属于类的,而非属于类中某个成员,虽使用某个成员可以调用Print1,但理论上这并不合理。

接下来我们看第二个:

我们使用非静态成员方法时,是可以访问静态成员变量的,但是接下来我们要看的方法三就与此恰恰相反了:

我们可以看到,成员变量都发生了报错,而唯独静态成员变量Class没有,这是因为静态成员方法不能访问非静态成员变量和非静态成员方法,因为非静态成员依赖于实例的创建。

三、代码块

代码块是一段被大括号{}括起来的代码段。在Java中,有以下几种类型的代码块:

① 普通代码块

通常用于限定变量的生命周期或者在局部作用域中定义临时变量

普通代码块可以在任何合法的位置使用,包括方法中、类中、循环中等等。当代码块执行完毕后,其中定义的变量将被销毁

② 构造代码块

构造代码块是在创建对象时执行的一段代码块,用于对对象进行初始化操作。

构造代码块是在所有构造方法执行之前执行的,而且每次创建对象时都会执行一次。

📚 我们可以尝试使用在刚刚的学生类中:

然后我们回到Main中:

我们可以看到,构造代码块的运行优先等级要高于构造方法并且构造代码块中将name = "无名"的操作也在构造方法执行也再次证明了这一点

而构造代码块的作用主要可以用于为某些成员变量赋初值

③ 静态代码块

这是三种代码块中最为重要的一种代码块,它的实用性远远大于前两种代码块。

静态代码块用于对类进行初始化操作。

📌 静态代码块有以下特点:

📕 在类加载时执行的一段代码块

📕 静态代码块只会执行一次

📕 在第一次使用该类时被调用,并且在静态变量初始化之前执行。

📕 如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行

大家还记得我们之前学习过的"学生管理系统"吗?当时我们并没有学习过代码块,所以我们在使用"学生管理系统"时就需要先创建一个能够使用的用户,然后才进行登录,使用系统。

而静态代码块就能够在此处大显神威~我们可以使用静态代码块来对一个账户数据进行初始化:

如此便在程序加载时便初始化了一个初始用户:

📌 而至于为什么静态代码块是最实用的代码块,这是因为:

📕 可以控制的只执行一次

📕 可以访问静态成员

四、内部类

内部类是一个定义在另一个类内部的类。它可以访问外部类的成员变量和方法并且可以被外部类或其他类实例化和使用

public class OuterClass {...public class InnerClass {...}
}

当一个对象的内部,有一部分数据还需要多一个完整结构进行描述,那么就可以使用内部类。

内部类可以分为以下几种类型:

① 实例内部类

实例内部类是一种定义在另一个类的内部的类,并且与外部类的实例相关联的内部类。

在内部类使用外部类成员变量并未报错~

📌 实例内部类的特点:

📕 可以访问外部类的实例变量和方法

📕 可以被外部类或其他类实例化和使用

📕 实例内部类的非静态方法中包含了一个指向外部类对象的引用

② 静态内部类

静态内部类是在另一个类的内部定义的静态类。

让我们对上一个示例代码稍加修改:

我们会发现,将实例内部类变成静态内部类后,外部类中的num便无法使用了,这是因为:

📕 在静态内部类中只能访问外部类中的静态成员

那么这篇关于(类与对象-下篇)的知识,就暂时为大家分享到这里啦,作者能力有限,如果有哪里说的不够清楚或者不够简洁,还请大家在评论区多多指出,那么我们下期再见啦~

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

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

相关文章

ubuntu 安装nginx

sudo apt-get update sudo apt-get install nginx sudo nginx -vsudo systemctl status nginx sudo systemctl start nginx sudo systemctl stop nginx sudo systemctl restart nginx#浏览器输入&#xff1a;http://192.168.31.181/#查看文件结构 cd /etc/nginx sudo cp nginx.…

Java 类和对象详解(下)

个人主页&#xff1a;鲤鱼王打挺-CSDN博客 目录 &#x1f497;前言&#xff1a; &#x1f4af;一.static关键字 1. 为什么要使用static 2. static 修饰成员变量&#xff1a; 3. static 修饰成员方法&#xff1a; ​编辑 4. 静态代码块 5.静态导入包 &#x1f4af;二.…

Wi-Fi安全性入门(基于ESP-IDF-v4.4)

主要参考资料&#xff1a; Wi-Fi 安全性: https://docs.espressif.com/projects/esp-idf/zh_CN/release-v4.4/esp32/api-guides/wifi-security.html 目录 1.ESP32 Wi-Fi 安全功能1.1 受保护的管理帧 (PMF)1.2 第三代 Wi-Fi 访问保护 (WPA3-Personal) 1.ESP32 Wi-Fi 安全功能 支…

linux系统之jar启动脚本

编辑linux启动脚本 执行 vi run_blog 按i 进入编辑&#xff0c;复制以下代码&#xff0c;并根据当前环境修改三个参数。以下是详细完整脚本代码&#xff1a; #!/bin/bash# 配置部分 JAR_PATH"/path/to/your/app.jar" # 替换为你的 JAR 文件的实际路径 L…

Gin框架操作指南07:路由与中间件

官方文档地址&#xff08;中文&#xff09;&#xff1a;https://gin-gonic.com/zh-cn/docs/ 注&#xff1a;本教程采用工作区机制&#xff0c;所以一个项目下载了Gin框架&#xff0c;其余项目就无需重复下载&#xff0c;想了解的读者可阅读第一节&#xff1a;Gin操作指南&#…

【JVM】内存模型

文章目录 内存模型的基本概念案例 程序计数器栈Java虚拟机栈局部变量表栈帧中局部变量表的实际状态栈帧中存放的数据有哪些 操作数栈帧数据 本地方法栈 堆堆空间是如何进行管理的? 方法区静态变量存储 直接内存直接内存的作用 内存模型的基本概念 在前面的学习中,我们知道了字…

Java 8 Stream API:从基础到高级,掌握流处理的艺术

一、Stream&#xff08;流&#xff09;基本介绍 Java 8 API 添加了一个新的抽象称为Stream&#xff08;流&#xff09;&#xff0c;可以让你以一种声明的方式处理数据&#xff0c;这种风格将要处理的元素集合看做一种流&#xff0c;元素流在管道中传输&#xff0c;并在管道中间…

云黑系统全解无后门 +搭建教程

这套系统呢是玖逸之前南逸写的一套云黑系统&#xff0c;功能带有卡密生成和添加黑名单等&#xff0c;源码放在我的网盘里已经两年之久&#xff0c;由于玖逸现在已经跑路了所以现在发出来分享给大家&#xff0c;需要的可以自己拿去而开&#xff0c;反正功能也不是很多具体的自己…

电脑视频剪辑大比拼,谁更胜一筹?

随着短视频的火爆&#xff0c;越来越多的人开始尝试自己动手制作视频&#xff0c;无论是记录生活点滴还是创作个性短片&#xff0c;一款好用的视频剪辑软件是必不可少的。今天&#xff0c;我们就从短视频运营的角度&#xff0c;来聊聊几款热门的电脑视频剪辑软件&#xff0c;看…

docker配置加速器

阿里云 控制台》容器镜像服务》镜像工具》镜像加速器 复制地址&#xff1a;https://ywtoq7bz.mirror.aliyuncs.com 到&#xff1a;etc/docker下&#xff1a;vi daemon.json 格式&#xff1a; { "registry-mirrors": ["加速器地址"] } 注&#xff1…

JavaScript:闭包、防抖与节流

一&#xff0c;闭包 1&#xff0c;什么是闭包 闭包是指一个函数和其周围的词法环境(lexical environment)的组合。 换句话说&#xff0c;闭包允许一个函数访问并操作函数外部的变量。 闭包的核心特性: 函数内部可以访问外部函数的变量即使外部函数已经返回&#xff0c;内部…

一款新开源跨平台的.NET Word(docx)模版导出引擎,完美支持Linux和Mac操作系统(附源码)

前言 在数字化办公日益盛行的今天&#xff0c;文档处理成为了我们日常工作不可或缺的一部分。然而&#xff0c;许多传统的文档处理工具都依赖于特定的操作系统和复杂的组件安装&#xff0c;这无疑给跨平台办公带来了诸多不便。为了解决这一问题&#xff0c;我们找到了一个新的…

【MR开发】在Pico设备上接入MRTK3(一)——在Unity工程中导入MRTK3依赖

写在前面的话 在Pico上接入MRTK3&#xff0c;目前已有大佬开源。 https://github.com/Phantomxm2021/PicoMRTK3 也有值得推荐的文章。 MRTK3在PICO4上的使用小结 但由于在MacOS上使用MRTK3&#xff0c;无法通过Mixed Reality Feature Tool工具管理MRTK3安装包。 故记录一下…

◇【论文_20151120_20160405v3】Dueling Network 决斗〔Google DeepMind〕

整理代码&#xff1a;Dueling_DQN__Pendulum_v1.ipynb https://arxiv.org/abs/1511.06581 Dueling Network Architectures for Deep Reinforcement Learning 文章目录 摘要1. 引言1.1. 相关工作 2. 背景2.1. Deep Q-networks 【DQN】2.2. Double Deep Q-networks 【DDQN】2.3…

OpenCV高级图形用户界面(13)选择图像中的一个矩形区域的函数selectROI()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 允许用户在给定的图像上选择一个感兴趣区域&#xff08;ROI&#xff09;。 该功能创建一个窗口&#xff0c;并允许用户使用鼠标来选择一个 ROI。…

其他css的用途

1.animation-fill-mode: backwards; //避免了在动画开始前元素的突然显现&#xff0c;动画必要。 2.用rem响应式字体大小&#xff0c;可以在html样式定义font-size?(例10px&#xff0c;62.5%(100%是16px))。然后样式就可以用rem代替px。 3.color: transparent;: 这行代码将文…

计算生物学与生物信息学漫谈-2-测序深度/读长质量和Fasta处理

上一篇文章中我们介绍了测序技术的由来与发展&#xff0c;那么在介绍第三代测序的时候&#xff0c;我们提到了关于测序深度和读长的问题&#xff0c;那么本篇文章就详解介绍一下。 计算生物学与生物信息学漫谈-1-测序一路走来-CSDN博客 目录 1.测序深度SEQUENCING DEPTH &…

《AI生成式工具使用》之:自助生成视频

目录 背景说明及目标&#xff1a; 实现过程&#xff1a; 1、有问题找度娘 2、利用剪映AI生成视频具体步骤 剪映AI感受 3、利用万彩AI生成视频具体步骤 万彩AI感受 4、利用腾讯云剪生成视频具体步骤 腾讯云剪感受 最终结论&#xff1a; 关注我&#xff0c;躺不平就一起…

【部署篇】RabbitMq-02单机模式部署

RabbitMQ和Erlang/OTP兼容性矩阵 下表提供了当前支持的RabbitMQ版本系列的Erlang兼容性矩阵。更多RabbitMQ版本&#xff0c;请参阅官网的系列兼容性列表。官网地址&#xff1a;https://www.rabbitmq.com/docs/which-erlang RabbitMQ版本最小支持版本最大支持版本备注 4.0.24.…

Axure重要元件三——中继器添加数据

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 本节课&#xff1a;中继器添加数据 课程内容&#xff1a;添加数据项、自动添加序号、自动添加数据汇总 应用场景&#xff1a;表单数据的添加 案例展示&#xff1a; 步骤…