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

目录

一、封装

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方法?

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

有容量限制的车辆路径规划问题(Capacitated Vehicle Routing Problem)

在看matlab的时候发现了这篇文章https://www.frontiersin.org/articles/10.3389/fict.2019.00013/full 仔细阅读一下。(英语渣渣,自学用) The Capacitated Vehicle Routing Problem (CVRP) is an NP-optimization problem (NPO) that has been of great interest …

秋招突击——算法打卡——5/24——无重复字符的最长字串

题目描述 实现代码 // 无重复字符的最长子串 int lengthOfLongestSubstring(string s) {int l 0,r 0;int res 0;unordered_map<char,int> temp;while(l < s.size()){temp[s.at(l)] l;for (r l 1; r < s.size() ; r) {if(temp.count(s.at(r))) break;else te…

CTF网鼎杯2020朱雀组 thinkjava思路记录

1.代码分析 BUUCTF在线评测 (buuoj.cn)打开ctf赛题之后&#xff0c;下载class文件&#xff0c;这个部分是不完整点的源码 在sqldict中存在一个sql注入点&#xff0c;没有采用java的预编译&#xff0c;调用了这个的是在test中&#xff0c;同时&#xff0c;这个采用了swagger接口…

基于 Faster-RCNN 的水稻叶片病害检测方法研究

1 前言 本次分享是使用基于 Faster-RCNN 的水稻叶片病害检测的深度学习算法研究&#xff0c;也是我研究的课题&#xff0c;本文本文使用的算法架构为 Faster R-CNN&#xff0c;研究的课题为使用两种不同的主干特征提取网ResNet-50 和VGG-16 模型进行模型训练和对比评估那…

windows ssh客户端mobaxterm密码登录到debian12 openssh服务器

1&#xff0c;在debian12生成公钥、秘钥 ssh-keygen -t rsa ~/.ssh/id_rsa 是秘钥&#xff0c;要放到windows的&#xff08;这里先不要放&#xff0c;等转换一下再放&#xff09;&#xff1b; ~/.ssh/id_rsa.pub 是公钥&#xff0c;放在debian12本地就好了&#xff0c; 顺…

HCIA第二天复习上

延长传输距离-------中继器&#xff08;放大器&#xff09;------物理层设备 可以延长5倍传输距离 增加网络节点数量 网络拓扑结构 1直线型拓扑 信息安全性差 网络延迟高传输速度慢 2环形拓扑 3星型拓扑 4网状型拓扑 传输效率高&#xff0c;…

MySQL主从复制(docker搭建)

文章目录 1.MySQL主从复制配置1.主服务器配置1.拉取mysql5.7的镜像2.启动一个主mysql&#xff0c;进行端口映射和目录挂载3.进入/mysql5.7/mysql-master/conf中创建my.cnf并写入主mysql配置1.进入目录2.执行命令写入配置 4.重启mysql容器&#xff0c;使配置生效5.进入主mysql&a…

cn.hutool.poi.excel 实现excel导出效果 首行高度,行样式,颜色,合并单元格,例子样式

需求 接了需求&#xff0c;下载excel模版&#xff0c;本来看着还是简单的&#xff0c;然后实现起来一把泪&#xff0c;首先是使用poi&#xff0c;我查了好久&#xff0c;才实现&#xff0c;然后是我用easyexcel又实现了一遍&#xff0c;用了一个周多才实现。 这是需求&#x…

docker实战之搭建MYSQL8.0主从同步

目录 环境配置容器创建主服务器创建MYSQL容器新增my.cnf文件创建用户并授权 从服务器创建MYSQL容器新增my.cnf文件重启MYSQL容器配置主从同步 验证主从同步彩蛋 MySQL 主从同步&#xff08;Master-Slave Replication&#xff09;是一种常用的解决方案&#xff0c;它允许一个主服…

【Redis7】Redis持久化机制之RDB

文章目录 1.RDB简介2.RDB配置触发设置3.RDB的优缺点4.如何检查修复RDB文件5.如何禁用RDB6.RDB参数优化7.总结 1.RDB简介 Redis持久化机制中的RDB&#xff08;Redis Database&#xff09;是一种将Redis在某个时间点的数据以快照形式保存到磁盘上的方法。 原理&#xff1a;RDB通…

python:pycharm虚拟解释器报错环境位置目录为空

目录 解释器分控制台解释器 和 pycharm解释器 控制台解释器切换&#xff1a; pycharm解释器 解释器分控制台解释器 和 pycharm解释器 控制台解释器切换&#xff1a; 切换到解释器下 激活解释器 查看解释器 where python 激活成功 这时在控制台使用python xxx.py 可以…

java面试框架篇(Spring常见问题、SpringBoot、SpringMVC、mybatis经典问题、SpringCloud组件)

文章目录 面试专题-java框架篇1. spring常见问题1.1. spring是什么?1.2. 谈谈你对AOP的理解1.3. 谈谈你对IOC的理解1.4. Spring Boot、 Spring MVC和Spring有什么区别1.5. spring bean 生命周期1.6. spring事务传播机制有哪些?1.7. 循环依赖1.8. spring框架中使用了哪些设计模…

在链游中,智能合约如何被用于实现游戏内的各种功能

随着区块链技术的快速发展&#xff0c;链游&#xff08;Blockchain Games&#xff09;作为区块链技术的重要应用领域之一&#xff0c;正逐渐展现出其独特的魅力和优势。其中&#xff0c;智能合约作为链游的核心技术之一&#xff0c;对于实现游戏内的各种功能起到了至关重要的作…

k8s的网路配置

目录 1、k8s相关网络类型 1.1 K8S中Pod网络通信 1.2 Overlay Network 1.3 VXLAN 1.3.1 vlan和vxlan的区别 2、Flannel 2.1 简介 2.2 Flannel工作原理 2.3 ETCD之Flannel提供说明 2.4 Flannel部署 2.4.1 在node节点上操作 2.4.2 在master01节点上操作 2.4.2.1 安装f…

LangChain llamaindex

LangChain 参考&#xff1a; 全流程 | Windows 系统本地部署开源模型阿里通义千问 QWEN 1.5&#xff0c;结合 LangChain-Chatchat 框架和向量数据库 FAISS、Milvus - 知乎

MySQL 插入数据的时候自动忽略重复数据

MySQL中插入数据&#xff0c;如果插入的数据在表中已经存在&#xff08;主键或者唯一键已存在&#xff09;&#xff0c;使用insert into语法的时候&#xff0c;如果遇到重复数据&#xff0c;会直接报错&#xff0c;导致事务回滚&#xff0c;所有插入数据&#xff0c;全部失败。…

Go语言直接使用Windows的IOCP API写一个echo服务器

Go的标准库中Windows下的网络是使用了IOCP的&#xff0c;参见go源码go/src/runtime/netpoll_windows.go&#xff0c;标准库为了与Epoll、kqueue等不同平台的IO模式使用统一的API&#xff0c;进行了封装。 如果想直接使用Windows的IOCP API编程&#xff0c;比如想按照&#xff…

iOS swift5 提示信息显示,提示弹框,第三方框架XHToastSwift

文章目录 1.github地址(亲测好用)2.源代码 1.github地址(亲测好用) XHToastSwift - github 2.源代码 XHToast.swift // // XHToast.swift // XHToastSwiftExample // // Created by xiaohui on 16/8/12. // Copyright © 2016年 CoderZhuXH. All rights reserved. …

x264 码率控制原理:rate_estimate_qscale 函数

rate_estimate_qscale 函数 原理 函数功能:根据目前使用的实际比特数更新一帧的qscale;是一个复杂的决策过程,需要考虑多种因素,如帧类型、编码的复杂度、目标比特率、缓冲区大小等,以确保视频质量和文件大小之间的平衡。函数参数分析:x264_t *h :编码器上下文信息结构…

鸿蒙开发ArkUI-X基础知识:【ArkUI代码工程及构建介绍】

代码工程及构建介绍 背景 ArkUI作为OpenHarmony的默认开发框架&#xff0c;在本项目&#xff08;ArkUI-X&#xff09;中需要做到一套代码同时支持多平台构建&#xff0c;所以会采取共仓开发的方式&#xff0c;部分仓直接指向OpenHarmony相关开源仓。 代码结构及仓库结构 代…