Java-类与对象-下篇

news2024/10/21 8:53:41

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

📚 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.coloradmin.cn/o/2219921.html

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

相关文章

特斯拉Optimus:展望智能生活新篇章

近日&#xff0c;特斯拉举办了 "WE ROBOT" 发布会&#xff0c;发布会上描绘的未来社会愿景&#xff0c;让无数人为之向往。在这场吸引全球无数媒体的直播中&#xff0c;特斯拉 Optimus 人形机器人一出场就吸引了所有观众的关注。从多家媒体现场拍摄的视频可以看出来&…

【C++】C++11新特性——右值引用,来看看怎么个事儿

&#x1f680;个人主页&#xff1a;小羊 &#x1f680;所属专栏&#xff1a;C 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 前言一、左值引用和右值引用二、右值引用和移动语义2.1 移动构造2.2 移动赋值2.3 STL容器插入接口2.4 左值右值相互…

【C++复习】经典笔试题

文章目录 八大排序快排过程 卡特兰数反转链表链表的回文结构左叶子之和另一棵树的子树归并排序类与对象编程训练杨辉三角字符串乘积二叉树前序遍历成字符串数组的交集二叉树的非递归前序遍历连续子数组的最大乘积 八大排序 插冒归稳定 快排过程 以 [3,4,6,1,2,4,7] 为例&#…

【计网笔记】以太网

经典以太网 总线拓扑 物理层 Manchester编码 数据链路层 MAC子层 MAC帧 DIX格式与IEEE802.3格式 IEEE802.3格式兼容DIX格式 前导码&#xff08;帧开始定界符SOF&#xff09; 8字节 前7字节均为0xAA第8字节为0xAB前7字节的Manchester编码将产生稳定方波&#xff0c;用于…

steam游戏模拟人生3缺少net framework 3.5安装不成功错误弹窗0x80070422怎么修复

模拟人生3在Steam上运行时提示缺少.NET Framework 3.5并出现错误代码0x80070422&#xff0c;通常意味着.NET Framework 3.5功能没有正确启用&#xff0c;或者安装过程中出现了问题。以下是解决这个问题的步骤&#xff1a; 1.启用Windows功能 按下Win R键&#xff0c;输入opti…

【论文学习与撰写】论文里的Mathtype公式复制粘贴,跨文档复制后错码/错位问题的解决

1、描述 问题&#xff1a;论文的草稿已经写好&#xff0c;里面的公式之类的都已经一个个打上去了 但是把草稿里的正文和公式粘贴在另一个文档里的时候&#xff0c;会出些公式格式错误的情况 那该怎么操作保证复制后的公式保持原格式呢 选中复制的内容&#xff0c;在另一个文…

MySQL【知识改变命运】10

联合查询 0.前言1.联合查询在MySQL里面的原理2.练习一个完整的联合查询2.1.构造练习案例数据2.2 案例&#xff1a;⼀个完整的联合查询的过程2.2.1. 确定参与查询的表&#xff0c;学⽣表和班级表2.2.2. 确定连接条件&#xff0c;student表中的class_id与class表中id列的值相等2.…

【c++篇】:解析c++类--优化编程的关键所在(一)

文章目录 前言一.面向过程和面向对象二.c中的类1.类的引入2.类的定义3.类的封装和访问限定符4.类的作用域5.类的实例化6.类对象模型 三.this指针1.this指针的引出2.this指针的特性3.C语言和c实现栈Stack的对比 前言 在程序设计的广袤宇宙中&#xff0c;C以其强大的功能和灵活性…

[k8s理论知识]6.k8s调度器

k8s默认调度器 k8s调度器的主要职责&#xff0c;就是为一个新创建出来的pod寻找一个适合的节点Node。这包括两个步骤&#xff0c;第一&#xff0c;从所有集群的节点中&#xff0c;根据调度算法挑选出所有可以运行该pod的节点&#xff0c;第二&#xff0c;从第一步的结果中&…

Java项目-基于springboot框架的企业客户信息反馈系统项目实战(附源码+文档)

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…

Windows环境下Qt Creator调试模式下qDebug输出中文乱码问题

尝试修改系统的区域设置的方法&#xff1a; 可以修复问题。但会出现其它问题&#xff1a; 比如某些软件打不开&#xff0c;或者一些软件界面的中文显示乱码&#xff01; 暂时没有找到其它更好的办法。

10-Docker安装Redis

10-Docker安装Redis Docker安装Redis 以 Redis 6.0.8 为例&#xff1a; docker pull redis:6.0.8直接pull会出现以下错误 [rootdocker ~]# docker pull redis:6.0.8 Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request can…

[Python学习日记-50] Python 中的序列化模块 —— pickle 和 json

[Python学习日记-50] Python 中的序列化模块 —— pickle 和 json 简介 pickle 模块 json 模块 pickle VS json 简介 什么叫序列化&#xff1f; 序列化指的是将对象转换为可以在网络上传输或者存储到文件系统中的字节流的过程。序列化使得对象可以被保存、传输和恢复&#…

3D Slicer 教程二 ---- 数据集

上一章下载3d slicer的软件,这章从加载数据集来弄清楚3dslicer怎么使用. 一. 加载数据集 如果没有数据集,也可用用样本数据. (1) "File" --> "add Data" 可以添加图片文件夹,(试了MP4不行,内镜的视频估计不支持),添加单个图片的话,会出现一些选项, …

C++贪心

前言 C算法与数据结构 打开打包代码的方法兼述单元测试 简介 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每一步选择中都采取在当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是全局最好或最优的算法策略。贪心算…

【设计模式系列】抽象工厂模式

一、什么是抽象工厂模式 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一个接口&#xff0c;用于创建一系列相关或相互依赖的对象&#xff0c;而无需指定它们具体的类。这种模式允许客户端使用抽象的接口来创建一组…

AUTOSAR_EXP_ARAComAPI的5章笔记(17)

☞返回总目录 相关总结&#xff1a;AutoSar AP CM通信组总结 5.7 通信组 5.7.1 目标 通信组&#xff08;Communication Group&#xff0c;CG&#xff09;是由 AUTOSAR 定义的复合服务模板。它提供了一个通信框架&#xff0c;允许在 AUTOSAR 应用程序之间以对等方式和广播模…

第6章 元素应用CSS作业

1.使用CSS对页面网页元素加以修饰&#xff0c;制作“旅游攻略”网站。 浏览效果如下&#xff1a; HTML代码如下&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>旅游攻略</title><link type"t…

[JAVAEE] 线程安全问题

目录 一. 什么是线程安全 二. 线程安全问题产生的原因 三. 线程安全问题的解决 3.1 解决修改操作不是原子性的问题 > 加锁 a. 什么是锁 b. 没有加锁时 c. 加锁时 d. 死锁 e. 避免死锁 3.2 解决内存可见性的问题 > volatile关键字 (易变的, 善变的) a. 不加…

【Linux】多线程安全之道:互斥、加锁技术与底层原理

目录 1.线程的互斥 1.1.进程线程间的互斥相关背景概念 1.2.互斥量mutex的基本概念 所以多线程之间为什么要有互斥&#xff1f; 为什么抢票会抢到负数&#xff0c;无法获得正确结果&#xff1f; 为什么--操作不是原子性的呢&#xff1f; 解决方式&#xff1a; 2.三种加锁…