【Java】/*类和对象(下)*/

news2025/1/15 9:50:57

目录

一、封装

1.1 初识封装 

1.2 如何封装成员变量 

1.3 如何使用封装后的成员变量

二、访问限定符

三、包

3.1 包的概念

3.2 如何自定义包

3.3 导入包中的类

3.4 包的访问权限控制举例

示例一:private修饰成员变量

示例二: 不去修饰成员变量

示例三:public修饰成员变量

注意:

3.5 常见的包

四、static成员

4.1 再谈学生类

4.2 static修饰成员变量

4.3 static修饰成员方法

4.4 static成员变量初始化

五、代码块

5.1 代码块概念以及分类

5.2 普通代码块

5.3 构造代码块

5.4 静态代码块

六、对象的打印

七、类与对象知识点综合举例


一、封装

1.1 初识封装 

1. 面向对象编程有三大特性:封装、继承、多态。

2. 在类和对象阶段,主要研究的就是封装特性。

3. 封装就相当于套上一层壳子屏蔽细节。这就好比像电脑这样一个复杂的设备,对于计算机使用者而言,不用关心内部核心部件,例如主板上线路是如何布局的,CPU内部是如何设计的等。用户只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。因此计算机厂商在出厂时,在外部套上壳子,将内部实现细节隐藏起来,仅仅对外提供开关机、鼠标以及键盘插孔等,让用户可以与计算机进行交互即可。

4. 封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互

1.2 如何封装成员变量 

1. 做法:用private修饰成员变量(private是私人的意思)。

2. 注意:修饰后的成员变量只能在当前类中使用。

1.3 如何使用封装后的成员变量

1. 做法:在类中给每个被private修饰的成员变量定义用public修饰的"set"、"get"方法,用于提供可对成员变量赋值和得到的接口。

2. 工具:编译器提供了可以快速生成"set"、"get"方法的开发工具,具体操作如下图

尝试使用一下这些"set"、"get"方法:

二、访问限定符

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

2. ① 用private修饰的成员变量和成员方法,只能在自己所在的类中使用。

    ② 没有用任何访问限定符修饰的成员变量和成员方法,只能在同一个包中的类中使用。

    ③ protected主要是用在继承中,继承部分详细介绍。

    ④ 用public修饰的成员变量和成员方法,在所有类中只要声明包的路径都能使用。

3. 补充1:空权限指默认权限,这里的默认权限指的是包访问权限,即没有被任何访问限定符修饰的成员变量和成员方法,它只能在同一个包中的Java文件中使用。

4. 补充2:访问权限除了可以限定类中成员的可见性,也可以控制类的可见性。

三、包

3.1 包的概念

1. 介绍:在日常生活中你的U盘中有很多歌曲,为了更好的管理电脑中的歌曲,一种好的方式就是将相同属性的歌曲放在相同文件下,也可以对某个文件夹下的音乐进行更详细的分类。例如下图:我们可以把众多歌曲先按照歌曲类型分为4个大的文件夹,在每个大的文件夹下又可以按照歌曲属于哪个歌手分为一些小的文件夹。

同样在Java中如果你有很多的Java文件,对它们在电脑中进行管理我们也会去使用文件夹,文件夹在Java中又被称为包(每个文件夹都有属于自己的路径,即每个包也都有属于自己的路径。创建的Java文件所在的路径不同,所属于的包就不同)。

2. 特点:在同一个工程中允许存在相同名称的类,只要处在不同的包中即可

3.2 如何自定义包

src是ideal默认的一个工程包。

自定义包的包名:① 全部小写 ② 一般情况下是域名的逆置写法,例如:域名是www.baidu.com,会写成com.baidu.www ( 这里相当于我们创建了三个包,路径分别是:com\、com\baidu\、con\baidu\www\ )

 设置好自定义包后,表现形式一般为下列两种,一般会采用第二种表现形式。

更改成第二种表现形式的设置步骤如下: 

下图中创建的两个名叫Student的Java文件并不冲突,因为一个是在com.baidu.www包下,另一个是在src包下。下面的图片2中,scr\代表scr包下的Student.java文件,www\代表www包下的Student.java文件。 

下图中用红色方框框起来的两个Student的Java文件也是不冲突的,因为第一个是在com.baidu.www包下,另一个在com.baidu.www2包下。

在自定义的包中建立的Java文件的第一行都会有一个package + 包名,这句代码的意义是声明这个Java文件所在的包的路径,例如:下图中第一行带码代表当前这个Java文件在包com.baidu.www下。如果Java文件是直接定义在默认的包src下,则Java文件的第一行是不会有package语句的。 

3.3 导入包中的类

写法一:采用导入包的形式 (一般采用这种形式)

我们平常在ideal中写代码时,直接在main方法中利用类即可,编译器会自动在当前的Java文件的头部导入这个类所在的包的路径或提供用户自己选择要导入哪个包中的类。

 写法二:不导入包的形式 (在利用类时,在类的前面写明它所在的包的路径)

当我们想要使用一个包中的多个类时,可以将导入包的格式写成,例如:import java.util.*,这里的*表示通配符的意思。这种写法表示"导入"了某个包中所有的类,这里的导入在Java中是你用到谁才会导入谁

虽然有上面这种简化的格式,但是仍然建议显示的指定要导入的类名,否则会很容易出现冲突的情况。 例如:下图中,java.util底下和java.sql底下都有Date这个类,当我们同时导入java.util.*和java.sql.*并且在main方法中在使用Date类时,编译器懵了不知道到底去使用哪个包中的Date类。 

上面情况的解决方法是: (在利用类时,在类的前面写明它所在的包的路径)

我们还可以使用import static导入包中静态的方法和字段,这样可以使得在使用某个类中的方法时,不用写类名直接调用方法 (这种写法的可读性非常差,不要使用!)

注意事项: import 和 C++ 的 #include 差别很大. C++ 必须 #include 来引入其他文件内容, 但是 Java 不需要. import 只是为了写代码的时候更方便,import 更类似于 C++ 的 namespace 和 using。

3.4 包的访问权限控制举例

示例一:private修饰成员变量

如下图,我们在scr\路径下创建了Student和test01,private的作用是使得被修饰的只能在自己的类中使用,因此我们在test01Java文件中使用Student类创建的对象时,会报错。

示例二: 不去修饰成员变量

如下图,我们在scr\路径下创建了Student,在com.baidu.www创建了test02。没有被任何访问限定符修饰的成员变量,只会有包访问权限,因此我们在test02Java文件中使用Student类创建的对象时,会报错。

示例三:public修饰成员变量

只要导入包后,在哪里都能使用。(这里就不详细举例了)

注意:

一般情况下成员变量设置为private,成员方法设置为public。

3.5 常见的包

1. java.lang:系统常用基础类(String、Object),此包从JDK1.1后自动导入。

2. java.lang.reflect:java 反射编程包;

3. java.net:进行网络编程开发包。

4. java.sql:进行数据库开发的支持包。

5. java.util:是java提供的工具程序包,(集合类等) 非常重要。

6. java.io:I/O编程开发包。

四、static成员

4.1 再谈学生类

下图中的代码,在我们利用学生类实例化三个学生对象时,既然大家都在同一个班,为什么要把班级的属性在每个对象的内存中都存一份浪费内存呢,有没有其他的写法?

答:有,可以将classRoom成员变量用static修饰。

4.2 static修饰成员变量

① 一个成员变量被static修饰后,那么此时这个成员变量就不属于对象了。

② 被static修饰的成员变量在内存中的存放位置将不再是堆区,而是在方法区 (用于存储已被虚拟机加载的类信息、常量、静态变量、以及编译器编译后的代码等数据) 。

③ 被static修饰的成员变量可以被所有实例化的对象所共用。

④ 被static修饰的成员变量,生命周期伴随类的一生(随类的加载而创建,随类的卸载而销毁)

⑤ 访问静态成员变量的方式有两种:第一种用对象的引用访问,第二种用类名访问(推荐)

⑥ 静态成员变量又称为类变量,它不依赖于对象。

4.3 static修饰成员方法

静态成员方法又称类方法

讨论一个问题:在下图代码中,为什么在静态方法中直接调用非静态方法会报错;而在非静态方法中直接调用非静态方法不会报错?

答:这是因为,在非静态方法中有一个隐形参数this,而在静态方法中并没有隐形参数this,对于非静态方法的调用又是依赖于对象的,因此如果直接在静态方法中调用非静态方法会报错。如果非要在静态方法中调用非静态方法,可以在静态方法中实例化对象了之后再调用非静态方法,如下面第二张图。如果是在静态方法中直接调用静态方法可以不用写类名,直接调用静态方法

总之:不能在类方法中,直接访问任何非静态的成员变量/方法

4.4 static成员变量初始化

1. 静态成员变量的初始化分为两种:就地初始化 和 静态代码块初始化。

2. 就地初始化指:在定义时直接给出初始值。

3. 要讲清楚静态代码块初始化,那得先了解什么是代码块。

五、代码块

5.1 代码块概念以及分类

使用 {} 定义的一段代码称为代码块。根据代码块定义的位置以及关键字,又可分为以下四种:

① 普通代码块

② 构造块

③ 静态块

④ 同步代码块(后续讲解多线程部分再谈)

5.2 普通代码块

普通代码块:定义在方法中的代码块(这种用法较少见)

5.3 构造代码块

1. 定义在类的里面,方法的外面的代码块称为构造块/示例代码块/非静态代码块,可用于初始化非静态的成员方法(也可以初始化静态的成员方法)。

2. 讨论问题1:在下面的代码中,构造方法和构造块谁先执行?

答:构造块先执行。

3. 讨论问题2: 在下面的代码中,成员变量和构造块谁先执行?

答:取决于在代码中定义的顺序。(一般,我们在类中会先定义属性,再定义其他的方法)

 

5.4 静态代码块

1. 静态的所有都不依赖于对象。

2. 静态代码块,用于初始化静态的成员变量(不可以用于初始化非静态的成员方法)。

3. 根据下图代码的运行结果可以发现,静态代码块>>构造块>>构造方法

4. 静态成员变量和静态代码块谁先执行?答:和成员变量和构造块谁先执行一样,取决于在代码中定义的顺序(这里就不举例了)。

 

 

六、对象的打印

利用重写toString方法,可以在类中不自己定义show方法。

例如,如下代码中,如果我们想要打印成员变量的信息,就需要自己写show方法。

如何利用重写toString方法?

七、类与对象知识点综合举例

  本篇文章已完结,谢谢支持哟 ^^ !!!

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

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

相关文章

网络拓扑—DNS服务搭建

文章目录 DNS服务搭建网络拓扑配置网络DNSPC 安装DNS服务配置DNS服务创建正向查找区域创建反向查找区域创建子域名 PC机DNS域名解析 DNS服务搭建 网络拓扑 为了节省我的U盘空间,没有用路由器,所以搭建的环境只要在同网段即可。 //交换机不用考虑 DNS&a…

hugging face笔记:PEFT

1 介绍 PEFT (Parameter-Efficient Fine Tuning) 方法在微调时冻结预训练模型参数,并在其上添加少量可训练的参数(称为适配器)这些适配器被训练用来学习特定任务的信息。这种方法已被证明在内存效率和计算使用上非常高效,同时能产…

靠着单干实现财富自由,可太爽了

这里所说的“单干”,并不是单打独斗的意思,而是一种商业认知,以及由这种认知衍生出来的商业模式、商业方法和商业实践。 之前提到单干,会本能地以为它是指脱离公司等组织形式,自己一个人做生意。现在单干有了更丰富的…

第十二章 网络编程

第十二章 网络编程 网络协议概述 通信协议: 协议即规则,就好比汽车上路要遵守交通规则一样,为了使全世界不同类型的计算机都可以连接起来,所以制定了一套全球通用的通信协议——Internet协议。有了Internet协议,任何…

【网络技术】【Kali Linux】Wireshark嗅探(十二)NBNS协议报文捕获及分析

往期 Kali Linux 上的 Wireshark 嗅探实验见博客: 【网络技术】【Kali Linux】Wireshark嗅探(一)ping 和 ICMP 【网络技术】【Kali Linux】Wireshark嗅探(二)TCP 协议 【网络技术】【Kali Linux】Wireshark嗅探&…

Swift 类和结构体

类和结构体 一、结构体和类对比1、类型定义的语法2、结构体和类的实例3、属性访问4、结构体类型的成员逐一构造器 二、结构体和枚举是值类型三、类是引用类型1、恒等运算符2、指针 结构体和类作为一种通用而又灵活的结构,成为了人们构建代码的基础。你可以使用定义常…

汇舟问卷:海外问卷调查如何闭坑?

大家好,我是汇舟问卷。有很多人问我这行有什么骗局吗?怎么说呢?其实每个行业都是真实存在的,也都有赚到钱的和赚不到钱的,那区别在哪里呢? 在你的源头,也就是教你或者说是代理加盟的上家&#…

LabVIEW舱段测控系统开发

LabVIEW舱段测控系统开发 在航空技术飞速发展的当下,对于航空器的测控系统的需求日益增加,特别是对舱段测控系统的设计与实现。开发了一款基于LabVIEW开发的舱段测控系统,包括系统设计需求、系统组成、工作原理以及系统实现等方面。 开发了…

电赛经验分享——赛前准备

⏩ 大家好哇!我是小光,想要成为系统架构师的嵌入式爱好者。 ⏩在之前的电赛中取得了省一的成绩,本文对电赛比赛前需要准备什么做一个经验分享。 ⏩感谢你的阅读,不对的地方欢迎指正。 加入小光嵌入式交流群(qq群号&…

【问题解决】Android Studio Jellyfish新建Kotlin项目后Gradle Sync及Maven下载很慢

创建新项目之后,Gradle Sync和Build都很慢,因为下载Gradle和Maven等工具。 代码默认配置 settings.gradle.kts pluginManagement {repositories {google {content {includeGroupByRegex("com\\.android.*")includeGroupByRegex("com\\.g…

框架学习之SpringMVC学习笔记(一)

一、SpringMVC简介 1-介绍 Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就包含在Spring Framework中。正式名称“Spring Web MVC”来自其源模块的名称( spring-webmvc ),但它通常被称为“Spring MVC”。 在控制层…

C语言中的 ?: :三元运算符详解

C语言中的 ?: :三元运算符详解 在C语言的浩瀚代码海洋中,三元运算符(?:)如同一位优雅的舞者,以简洁的姿态完成条件判断与赋值的双重任务。它以问号(?)和冒号(:)这两个…

魔众文库系统v6.6.0分销功能,后台日志重构,文档转换优化

分销功能,后台日志重构,文档转换优化 [新功能] 升级支持支付宝授权登录最新方式 [新功能] 后台左上角标题支持自定义,修改 modstart.php 中 admin.title 配置 [新功能] 日志界面重构,全新日志查看体验 [新功能] 链接选择弹窗增…

C语言 | Leetcode C语言题解之第110题平衡二叉树

题目: 题解: int height(struct TreeNode* root) {if (root NULL) {return 0;}int leftHeight height(root->left);int rightHeight height(root->right);if (leftHeight -1 || rightHeight -1 || fabs(leftHeight - rightHeight) > 1) {…

SpringBoot3整合阿里云短信服务-1(配置阿里云短信服务)

SpringBoot3整合阿里云短信服务-1(配置阿里云短信服务) 一、开通阿里云短信服务 阿里云官网:阿里云官网 选择产品中企业服务与云通信中的短信服务 选择免费开通 选择快速学习和测试 根据这几个全部配置一下我这里是配置好了所以学习进度是100% 1.1 添加资质 首先选择新增资质 …

三台泵恒压供水站电控系统及PLC程序设计实例

本文由艺捷自动化编写,其旗下产品有艺捷自动化网站和易为二维码说明书小程序(微信) 本文以一个具体的项目案例,来讲述一个恒压供水站的电控柜设计过程。包括用户需求,材料选型,图纸设计,柜内布…

微软新功能Recall引发隐私担忧,英国数据监管机构展开调查

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

大语言模型的工程技巧(三)——分布式计算

相关说明 这篇文章的大部分内容参考自我的新书《解构大语言模型:从线性回归到通用人工智能》,欢迎有兴趣的读者多多支持。 本文将讨论如何利用多台机器进行神经网络的分布式训练。利用多台机器来加速大语言模型的训练,是其获得成功的重要原…

政安晨:【Keras机器学习示例演绎】(四十九)—— 利用 KerasNLP 实现语义相似性

目录 简介 数据集 设置 准备数据 配置特征空间 进一步自定义特征空间 根据训练数据调整特征空间 制作模型 训练模型 使用端到端模型对新数据进行推理 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实…

Redis服务启动以及连接redis客户端(可配置密码)

1.Redis解压后目录 启动服务器: 1. 输入:redis-server.exe redis.windows.conf回车 ctrlC退出 连接客户端: 同样先打开命令窗口: 输入redis-cli.exe或者redis-cli.exe -h localhost -p 6379 exit退出 注意:想添加密…