day05-面向对象内存原理和数组
day05 面向对象内存原理和数组
我们在之前已经学习过创建对象了,那么在底层中他是如何运行的。
1.对象内存图
1.1 Java 内存分配
Java 程序在运行时,需要在内存中分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。


Cat cat = new Cat();
突出了解对于堆栈的学习。
1.2 堆和栈
栈:所有局部变量都会在栈内存中创建
局部变量:定义在方法中的变量或者方法声明上的变量
方法执行都会加载到栈中进行
局部变量特点:随着方法的调用而存在,随着方法的调用完毕而消失
代码:Student s = new Student();
堆:所有对象及其对应的实例变量和数组都将存储在此处
简单理解为:new出来的东西,都存储在堆内存
每一个new出来的东西都有一个地址值,使用完毕,会在垃圾回收器空闲时被回收
实例变量(成员变量)有初始化值:
基本数据类型:整数:0,浮点数:0.0,布尔:false,字符:空字符
引用数据类型:null
成员变量和局部变量的区别
| 区别 | 成员变量 | 局部变量 |
|---|---|---|
| 类中位置不同 | 类中方法外 | 方法内或者方法声明上 |
| 内存中位置不同 | 堆内存 | 栈内存 |
| 生命周期不同 | 随着对象的存在而存在,随着对象的消失而消失 | 随着方法的调用而存在,随着方法的调用完毕而消失 |
| 初始化值不同 | 有默认的初始化值 | 没有默认的初始化值,必须先定义,赋值,才能使用 |
单个对象 指向一个地址多个对象 指向对应数量的多个地址多个引用指向相同 地址可以为同一个
1.3 堆-栈内存总结
1.new 对象会创建堆内存
2.声明变量 只创建栈内存
3.多个变量可以指向一个对象
4.局部变量存在栈内存,用完就消失,作用范围仅限方法或者局部{}范围
5.成员变量会存在堆内存,随着对象消失才消失,作用范围类范围
2.private
是一个权限修饰符
可以修饰成员(成员变量和成员方法)
作用是保护成员不被别的类使用,被 private 修饰的成员在本类中可以通过 实例对象.属性名进行访问。
针对 private 修饰的成员变量,如果需要被其他类使用,提供两个相应的操作:
提供“get变量名()”方法,用于获取成员变量的值,方法用 public 修饰
提供“set变量名(参数)”方法,用于设置成员变量的值,方法用 public 修饰
eg:
public class Student {private String name;public String getName() {return name; }public void setName(String name) {this.name = name;}//被 private 修饰的成员在本类中可以通过实例对象.属性名进行访问public static void main(String[] args) {Student student = new Student();System.out.println(student.name);}
}
public class People {public static void main(String[] args) {Student student = new Student();System.out.println(student.name);//报错!!}
}
3.this
this:方法被哪个对象调用,this就代表哪个对象。
① 什么时候使用this呢?
解决局部变量隐藏成员变量
局部变量和成员变量名字一致,局部变量赋值给成员变量。
② this限定的变量用于指代成员变量
方法的形参如果与成员变量同名,
不带this修饰的变量指的是形参,而不是成员变量
方法的形参没有与成员变量同名,
不带this修饰的变量指的是成员变量
public class Student { private String name; public String getName() {return name; }public void setName(String name) {this.name = name;}
}
public void setName(String username) {name = username;//这里可以不用this}
4.封装
1.封装概述
是面向对象三大特征之一(封装,继承,多态)
是面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界是无法直接操作的
eg:相当于把水放在一个水杯中,只能通过水杯出水口喝水。 外界是无法拿到水,只能通过一个公共的出口取水。
2.封装原则
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
成员变量private,提供对应的**getXxx()/setXxx()**方法
3.封装好处
通过方法来控制成员变量的操作,提高了代码的安全性
把代码用方法进行封装,提高了代码的复用性
规范代码:
public class Student {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}private int age;public int getAge() {return age; }public void setAge(int age) {this.age = age;}
}
快捷方式:alt+insert 选择getterAndSetter
5.构造方法
5.1 构造方法概述
构造方法是一种特殊的方法
作用:创建对象
格式:
public class 类名{ 修饰符 类名(参数) { }}
功能:主要是完成对象数据的初始化
5.2 构造方法的注意事项
① 构造方法的创建
如果没有定义构造方法,系统将给出一个默认的无参数构造方法
如果定义了构造方法,系统将不再提供默认的构造方法
② 构造方法的重载
如果自定义了带参构造方法,还要使用无参数构造方法,就必须再写一个无参数构造方法
③ 推荐的使用方式
永远提供无参数构造方法
5.3 JavaBean
就是一个Java中的类,其对象可以用于在程序中封装数据
举例:学生类,手机类
标准 JavaBean 须满足如下要求:
1.成员变量使用 private 修饰
2.提供每一个成员变量对应的 setXxx() / getXxx()
3.提供一个无参构造方法
5.4 练习
手机 JavaBean
需求:编写手机 JavaBean,并在测试类中使用
提示:手机有成员变量brand(品牌)和price(价格)
6.数组
数组概述
为了存储一个学员的考试成绩,我们可以采用一个变量进行存储,如果我有很多个学员的考试成绩,我们也可以用多个变量进行存储。但是,如果学员人数太多,这样定义变量就太麻烦了,这就对我们存储数据提出了新的诉求:一次性声明大量的用于存储数据的变量,要存储的数据通常都是同类型数据,例如:考试成绩。满足这种诉求的东西是什么呢?就是我们接下来要讲解的数组。来我们说一下什么是数组。
int a = 100int b = 100int c = 100int d = 100int e = 100int f = 100int g = 100… …

一次性声明大量的用于存储数据的变量
要存储的数据通常都是同类型数据,
例如:考试成绩int[] scores = {100,100,100,100,100,100,100…};
什么是数组
数组(array):是一种用于存储多个相同数据类型的存储模型(可以理解为容器)
1.数组定义格式
格式1:数据类型[] 变量名;
范例: int[] arr;
定义了一个int类型的数组,数组名是arr
格式2:数据类型 变量名**[];
范例: int arr[]**;
定义了一个int类型的变量,变量名是arr数组
推荐使用:格式1
2.数组初始化概述
静态初始化
动态初始化
2.1.数组初始化之静态初始化
静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度
格式:数据类型[] 变量名 = new 数据类型[]{数据1,数据2,数据3,…};
范例:int[] arr = new int[]{1,2,3};
简化格式:数据类型[] 变量名 = {数据1,数据2,数据3,…};
范例:int[] arr = {1,2,3};
2.2 数组初始化之动态初始化
动态初始化:初始化时只指定数组长度,由系统为数组分配初始值
格式:数据类型[] 变量名 = new 数据类型[数组长度];
范例:int[] arr = new int[3];
使用场景:
静态初始化:开始就存入元素值,适合一开始就能确定元素值的业务场景
动态初始化:指定数组长度,后期赋值,适合开始知道数据的数量,但是不确定具体元素值的业务场景
注意:两种初始化的方式是独立的,不可以混用
int[] arr = new int[3]{30,40,50}; //错!!!!
2.3 数组元素来自键盘录入
需求:定义一个可以存储5个元素的int数组,数据来自于键盘录入,最后遍历数组,把元素输出在控制台分析:
① 数组长度可知,元素未知,采用动态初始化
② 键盘录入,使用Scanner实现
eg:
public static void main(String[] args) {int[]arr = new int[5];Scanner sc = new Scanner(System.in);for (int j = 0; j < 5; j++) {System.out.println("请输入第" + (j+1) + "个数");arr[j] = sc.nextInt();}printArray(arr);}public static void printArray(int[] arr) {System.out.print("[");for (int i = 0; i < arr.length; i++) {if(i==arr.length-1) {System.out.print(arr[i]);}else {System.out.print(arr[i] + ", ");}}System.out.println("]");}
3.数组元素访问
3.1 数组变量访问方式
格式:数组名
3.2 数组内部保存的数据的访问方式
格式:数组名[索引]
3.3 索引是数组中数据的编号方式
作用:索引用于访问数组中的数据使用,数组名[索引]等同于变量名,是一种特殊的变量名
特征①:索引从0开始
特征②:索引是连续的
特征③:索引逐一增加,每次加1
4.数组常见操作
4.1遍历
什么是数组遍历
获取数组中的每一个元素,我们可以把获取到的元素输出在控制台
获取数组长度(元素个数)
格式:数组名.length
范例:arr.length
数组遍历通用格式:
int[] arr = {...};
for (int i = 0; i < arr.length; i++) {
arr[i]; //对元素arr[i]进行操作
}
注意:数组遍历指的是把数组中的元素取出来,取出来之后可以(打印,求和,判断…)
4.2 获取最大值

获取数组中最大值
public static void main(String[] args) {//定义数组int[] arr = {12, 45, 98, 73, 60};//定义变量max存储最大值,取第一个数据为变量的初始值int max = arr[0];//与数组中剩余数据逐个比对,每次比对将最大值保存到变量max中for (int i=1; i<arr.length; i++) {if(arr[i] > max) {max = arr[i];}}//循环结束后输出变量max的值System.out.println("max:" + max);}
4.3 元素打乱
把数组中的元素随机交换位置,每次运行都可能产生不一样的结果
比如:arr = {12, 45, 98, 73, 60};
遍历:
正常情况下:12,45,98,73,60
元素打乱后:45,73,12,60,98
涉及到的操作
获取数组中元素的随机索引
Random r = new Random();
int index = r.nextInt(arr.length);
数组中元素交换
int a = 10;
int b = 20;
int temp = a;
a = b;
b = temp;
System.out.println(a);
System.out.println(b);
元素打乱案例
public static void main(String[] args) {//定义数组int[] arr = {12, 45, 98, 73, 60};// Random r = new Random();
// int index = r.nextInt(arr.length);
//
// //第一次交换
// int temp = arr[0];
// arr[0] = arr[index];
// arr[index] = temp;
//
// //第二次交换
// index = r.nextInt(arr.length);
// temp = arr[1];
// arr[1] = arr[index];
// arr[index] = temp;Random r = new Random();for (int i = 0; i < arr.length; i++) {int index = r.nextInt(arr.length);int temp = arr[i];arr[i] = arr[index];arr[index] = temp;}//遍历数组for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}
5.思考问题数组常见问题
请问下列代码有问题吗?
int[] arr = new int[3];//输出元素
System.out.println(arr[3]);
如果有,是什么问题?
如何解决?
有问题访问了不存在的索引位置元素修改不存在的索引为正确的索引。范围(0~数组长度-1)
int[] arr = new int[3];
System.out.println(arr[2]);//把 null赋值给数组
arr = null;// 输出元素
System.out.println(arr[0]);
数组使用中的两个小问题1:索引越界:访问了数组中不存在的索引对应的元素,造成索引越界问题ArrayIndexOutOfBoundsException2:空指针异常:对象不再指向堆内存,还想继续访问数据,访问失败NullPointerExceptionnull:空值,引用数据类型的默认值,表示不指向任何有效对象
6.二维数组(自学作业)
需求:我们要存储多个班级的学生的考试成绩,该怎么办呢?
如果要存储一个班级中多个学生的考试成绩,我们就可以采用数组来存储。
多个班级的考试成绩,我们针对每个班级都采用数组存储:
第一个班级:数组1
第二个班级:数组2
第三个班级:数组3
…
但是多个班级也可以采用数组存储啊?所以,Java就提供了二维数组供我们使用
6.1二维数组概述
二维数组:元素为一维数组的数组
定义格式:
数据类型[][] 变量名; int[][] arr;//重点
数据类型 变量名[][]; int arr[][];
数据类型[] 变量名[]; int[] arr[];
6.2二维数组初始化
6.21静态初始化
1.格式:
数据类型[][] 变量名 = new 数据类型[][]{{元素…},{元素…},{元素…},…};
2.范例:
int[][] arr = new int[][]{{1,2,3},{4,5,6},{7,8,9}};
3.解读
定义了一个二维数组
二维数组中有三个元素(一维数组)
每一个一维数组有三个元素(int类型数据)
4.注意:一维数组中元素的个数可以是不同的
举例: int[][] arr = new int[][]{{1,2,3},{4,5},{6,7,8,9}};
5.简化格式:
数据类型[][] 变量名 = {{元素…},{元素…},{元素…},…};
6.范例:
int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};
6.22 动态初始化
1.格式:
数据类型[][] 变量名 = new 数据类型[m][n];
2.范例:
int[][] arr = new int[2][3];
3.解读
定义了一个二维数组
二维数组中有2个元素(一维数组)
每一个一维数组有3个元素(int类型数据)
6.23 二维数组元素访问
获取二维数组:数组名
获取每一个一维数组:数组名[索引] 从0开始
获取每一个二维数组元素:数组名[索引][索引] 从0开始
6.24 二维数组常见操作
遍历&元素打乱
1.二维数组遍历
需求:已知一个二维数组 arr = {{1,2,3},{4,5,6},{7,8,9}}; 请把元素在控制台输出
二维数组中循环嵌套的使用:
① 循环嵌套:循环语句中嵌套循环语句
② 外层循环得到一维数组
③ 内存循环得到每一个二维数组元素
public static void main(String[] args) {int[][]arr = {{1,2,3},{4,5,6},{7,8,9}};for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr.length; j++) {System.out.println(arr[i][j]);}}}
2.二维数组元素打乱
需求:已知二维数组 arr = {{1,2,3},{4,5,6},{7,8,9}};
用程序实现把数组中的元素打乱,并在控制台输出打乱后的数组元素
public static void main(String[] args) {int[][]arr = {{1,2,3},{4,5,6},{7,8,9}};Random r = new Random();for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr.length; j++) {//arr[i][j]int a = r.nextInt(arr.length);int b = r.nextInt(arr.length);//元素交换int temp = arr[i][j];arr[i][j] = arr[a][b];arr[a][b]= temp;}}for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr.length; j++) {System.out.print(arr[i][j]+" ");}}}
int[][]arr = {{1,2,3},{4,5,6},{7,8,9}};Random r = new Random();for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr.length; j++) {//arr[i][j]int a = r.nextInt(arr.length);int b = r.nextInt(arr.length);//元素交换int temp = arr[i][j];arr[i][j] = arr[a][b];arr[a][b]= temp;}}for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr.length; j++) {System.out.print(arr[i][j]+" ");}}
}
相关文章:
day05-面向对象内存原理和数组
day05 面向对象内存原理和数组 我们在之前已经学习过创建对象了,那么在底层中他是如何运行的。 1.对象内存图 1.1 Java 内存分配 Java 程序在运行时,需要在内存中分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域…...
从头理解transformer,注意力机制(下)
交叉注意力 交叉注意力里面q和KV生成的数据不一样 自注意力机制就是闷头自学 解码器里面的每一层都会拿着编码器结果进行参考,然后比较相互之间的差异。每做一次注意力计算都需要校准一次 编码器和解码器是可以并行进行训练的 训练过程 好久不见输入到编码器&…...
ORA-609频繁出现在alert.log,如何解决?
ORA-609就alertlog中比较常见的一个报错,虽然并没有太大的影响,但是频繁的出现在alert log也是很让人厌烦的事情,本文介绍如何排查解决ORA-609问题。 1.ORA-609官方定义 could not attach to incoming connection Cause Oracle process cou…...
JVM 类加载机制
JVM 类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程。 加载 加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这个类的 java.lang.class 对…...
亲测-wordpress文章实时同步发布修改删除多个站点的WP2WP插件
一款将wordpress文章同步到其他WordPress网站的插件,通过这款插件,可以保持不同博客之间文章发布、修改、删除的同步。 安装步骤: 主站和分站都要上传这个插件 1.把插件上传到wp-content\plugins解压出来wp2wp文件夹,然后启用插…...
npm无法安装node-sass 的问题
安装 node-sass 的问题呈现:4.9.0版本无法下载 Downloading binary from https://github.com/sass/node-sass/releases/download/v4.9.0/win32-x64-72_binding.node Cannot download "https://github.com/sass/node-sass/releases/download/v4.9.0/win32-x64-…...
springboot 引入第三方bean
如何进行第三方bean的定义 参数进行自动装配...
安装Nginx
如果没有gcc环境,需要安装gcc yum install gcc-c安装依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel工作目录 mkdir /opt/nginx && cd /opt/nginx下载安装包 wget http://nginx.org/download/nginx-1.32.1.tar.gz解压安装包…...
爬虫工具you-get
you-get是一个简单易上手的爬虫小工具,可以从网络中爬取多媒体信息,包括图片、音频和视频。you-get的github项目地址为:https://github.com/soimort/you-get 一、安装 以下为相关依赖,需要分别安装: Python 3 (必须…...
hal_stm32_RTC函数
1设置当前时间: 调用 HAL_RTC_SetTime 来设置小时、分钟、秒和亚秒。 调用 HAL_RTC_SetDate 来设置年、月、日和星期。 HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format); HAL_StatusTypeDef HAL_RTC_SetDat…...
【大数据·Hadoop】从词频统计由浅入深介绍MapReduce分布式计算的设计思想和原理
一、引入:词频统计问题 假如我们有一亿份文档,需要统计这一亿份文档的词频。我们会怎么做,有以下思路 使用单台PC执行:能不能存的下不说,串行计算,一份一份文档读,然后进行词频统计࿰…...
win10建立共享文件夹和ipad共享文件
win10端设置 查看自己的局域网IP 在任意地方新建一个文件夹 打开文件夹的属性,点到共享的地方 点击高级共享 然后点击应用,确认 再回到之前哪个地方,点击共享 把Everyone的权限改为读取/写入 最后点击共享就欧克了 失败的可能原因 ipad端设置 然后回出现一个要输入用户名和…...
手机在网状态多方面重要性
手机在网状态的重要性体现在多个方面,它是现代社会中人们保持联系、获取信息以及进行日常活动不可或缺的一部分。以下是一些关于手机在网状态重要性的详细解释: 通信联系: 手机是在现代社会中进行通信联系的主要工具。当手机处于在网状态时&…...
Multitouch for Mac:手势自定义,提升工作效率
Multitouch for Mac作为一款触控板手势增强软件,其核心功能在于手势的自定义和与Mac系统的深度整合。通过Multitouch,用户可以轻松设置各种手势,如三指轻点、四指左右滑动等,来执行常见的任务,如打开应用、切换窗口、滚…...
IDEA创建springboot项目时不能选择java 8或者java 11等等版本的问题,解决方案
文章目录 1. Project JDK 和 Java 的区别2. 没有 java 8 或 java 11 等版本2.1 方案一2.2 方案二2.3 方案三 1. Project JDK 和 Java 的区别 我们在利用 idea 创建 spring boot 项目时,会有以上两个选项,这两个选项有什么区别? 答ÿ…...
SpringCloudAlibaba:4.3云原生网关higress的JWT 认证
概述 简介 JWT是一种用于双方之间传递安全信息的简洁的、URL安全的声明规范。 定义了一种简洁的,自包含的方法用于通信双方之间以Json对象的形式安全的传递信息,特别适用于分布式站点的单点登录(SSO)场景 session认证的缺点 1.安…...
【机器学习】Reinforcement Learning-强化学习基本概念
1、Q值与V值 1.1 Q值和V值的定义 Q值:也称为动作价值函数,评估动作的价值,它代表了智能体选择这个动作后,一直到最终状态奖励总和的期望,表示为Q(s, a),其中 s是状态,a是动作。 V值ÿ…...
vim编辑器---(1)vim编辑器介绍?
(1)vim编辑器介绍? 1 目录 (a)IC简介 (b)vim简介 (c)Verilog简介 (d)vim编辑器介绍? (e)结束 1 IC简介…...
解密 Unix 中的 “rc“ 后缀:自定义你的工作环境
在文件名中,rc 通常表示 “run commands”(运行命令)或者 “runtime configuration”(运行时配置)。这种命名惯例源自早期的 Unix 系统,用于指示这些文件包含了一系列要在程序运行时执行的命令或配置选项。…...
Java使用csv导出多字段大数据文件(无需写实体映射,自动遍历)
csv工具类CsvUtils 此处使用LinkedHashMap链表哈希表,实现键值中值为空时仍存在数据以及保证顺序与sql顺序一致。 package com.xxx.xxx.utils;import lombok.val; import org.springframework.util.CollectionUtils; import javax.servlet.http.HttpServletRespons…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
python基础语法Ⅰ
python基础语法Ⅰ 常量和表达式变量是什么变量的语法1.定义变量使用变量 变量的类型1.整数2.浮点数(小数)3.字符串4.布尔5.其他 动态类型特征注释注释是什么注释的语法1.行注释2.文档字符串 注释的规范 常量和表达式 我们可以把python当作一个计算器,来进行一些算术…...
day51 python CBAM注意力
目录 一、CBAM 模块简介 二、CBAM 模块的实现 (一)通道注意力模块 (二)空间注意力模块 (三)CBAM 模块的组合 三、CBAM 模块的特性 四、CBAM 模块在 CNN 中的应用 一、CBAM 模块简介 在之前的探索中…...
