类和对象深度解析:从new内存机制到构造方法、this与重载
刚接触编程的朋友十有八九都卡在“类和对象”这道坎上。教材里说“类是抽象的概念对象是具体的实例”听起来像绕口令代码一写更是手足无措——类到底要怎么设计对象又是怎么被创建出来的new 关键字背后究竟干了什么为什么同一个类能造出一堆互不干扰的对象这些问题如果只靠死记硬背后面学到继承、多态、设计模式时会越学越糊涂。这篇文章我把“类和对象(上)”这部分最核心的知识拆开揉碎用生活化的类比加上可运行的代码示例把类的定义、对象的创建、构造方法、this 引用、方法重载这些内容一次讲透每段都会配上我实际写代码和帮别人调代码时踩过的坑。适合正在学 Java、C# 或者任何一门面向对象语言的初学者也适合那些学完一遍但总觉得“差点意思”的朋友来夯实基础。1. 为什么说类是图纸对象是房子先花点时间把“类”和“对象”这两个词掰扯清楚。很多初学者上来就背定义背完了还是不知道怎么写代码问题就出在从来没想过这两个概念到底在解决什么问题。用盖房子来打比方是最直观的——一张建筑图纸绝对不是房子但所有房子都长得跟图纸一模一样图纸可以复印一万份每份图纸盖出来的房子都是独立的一栋你不可能因为拆了 A 栋就让 B 栋也塌了。这套逻辑映射到编程里就是类就是那张图纸对象就是按图纸盖出来的那一栋栋房子。// 图纸描述房子有什么属性、能做什么事 class House { String color; // 颜色 int floorCount; // 楼层数 void showInfo() { System.out.println(颜色: color , 楼层: floorCount); } }这段代码只定义了一个模板不占用任何具体的“房子”资源程序里也不会因为写了这个类就真的出现一栋房子。只有执行了new House()那一刻才实实在在地创建了一个对象。House myHouse new House();到这一步内存里才多了一栋“颜色为空、楼层为0”的房子。一个是描述、一个是实体这就是类和对象最本质的差异。1.1 类的两大组成属性负责状态方法负责行为在设计一个类的时候其实就两件事这个类应该有哪些数据这个类应该能做什么操作数据在 Java 中表现为“成员变量”操作表现为“成员方法”统称类的成员。拿“用户”这个类来说用户名、密码、邮箱这些属于状态用变量存储登录、登出、修改密码这些属于行为用方法定义。设计类的过程跟做产品需求类似先定状态再定行为二者配合起来才是一个完整的功能单元。class User { String username; String password; String email; void login() { // 登录逻辑 } void logout() { // 登出逻辑 } }这里有个实际经验想分享初学者设计类的时候特别容易把成员变量全写成public图省事。但这会在项目复杂化之后带来很大的维护麻烦——别的类可以直接改你的数据改出问题了你都不知道是谁改的。封装性是从“类和对象”就该建立的意识不能只把它当成后面章节的一个名词。我自己接手过某位同学的代码一个类里 20 个public字段到处被赋值查一个 bug 查了半天最后发现是别的模块悄悄改了他的状态。能用private就先private通过 getter/setter 暴露访问入口这个习惯越早养越好。1.2 只定义静态变量连类都不用实例化等等这不对还有一个容易混淆的点如果一个类里只有静态变量和静态方法是不是就不需要“类”这个概念了并不是。静态成员属于类本身但静态成员依然需要类作为载体。很多人会把“静态方法”理解为“全局函数”乍一看确实像但它仍然被组织在类里这本身就是“类”的意义所在——即使你不需要对象你也需要一个地方把相关的函数和数据收拢起来。2. new 关键字背后的四步魔法对象创建拆解很多初学者看完上面的内容会觉得“哦new 一个对象就是多了一块内存”。但真到面试或者调 bug 的时候问一句“new 到底做了什么”能答上来的人屈指可数。我建议把new关键字理解成四步操作在堆内存中为这个对象分配一块空间执行构造方法后面会详细说完成对象的初始化把这块空间的地址值返回出来将地址值赋给左侧的引用变量其中第 4 步是新手最容易误解的地方。House myHouse new House();这行代码里myHouse并不是房子本身它只是一张写着房子地址的小纸条。你拿着纸条能找到那栋房子但纸条不是房子。House h1 new House(); House h2 h1;执行完这两行之后h1和h2是两个引用变量但它们指向的是同一栋房子。如果你通过h1把房子的颜色改成蓝色通过h2看到的房子也是蓝色的。这就像你和我手里各拿一张写着同一栋房子地址的纸条我进屋把墙刷了你进去看到的当然是刷完的墙。2.1 栈与堆引用与对象的物理位置内存模型是理解上述行为的关键。Java 内存大体上分为栈Stack和堆Heap局部变量、引用变量存放在栈中生命周期随方法结束而结束对象本体存放在堆中生命周期由垃圾回收器管理public void demo() { House h new House(); // h 在栈中House 对象在堆中 }demo()方法执行完后栈中的h会被清除但如果没有任何其他引用指向这个对象了堆中的房子就变成了“没人要的房子”等待垃圾回收。这解释了为什么“引用变量消失了对象本体不一定立刻消失”——它可能还被别的引用握着。2.2 为什么数组也能用 new数组也是对象关于对象创建还有一个特别容易被忽略的冷知识数组也是对象。在 Java 中new int[5]也是创建一个对象只不过这个对象的“成员变量”是用下标访问的元素。这也是为什么数组有length属性能被赋给引用变量int[] arr new int[5]; // arr 是一个引用变量指向一个数组对象理解了这一点你就能明白为什么方法中修改数组内容会真实影响到数组本身而修改普通的int参数变量却不会——因为数组传的是“纸条的复印件”但指向的还是原来那栋房子。3. 构造方法控制对象的出厂设置对象创建之后并不是一片空白我们总希望它一“出生”就带着一些默认值。比如创建一个Student对象时希望他的名字已经填好“张三”年龄已经是 18。这就轮到构造方法登场了。构造方法长得跟普通方法很像但有两个绝对区别方法名必须和类名完全一致没有返回值类型连void都不能写class Student { String name; int age; Student(String name, int age) { this.name name; this.age age; } }但是有一个很经典的坑如果你一个构造方法都没写编译器会给你一个默认的无参构造方法所有引用类型字段初始化为null数值类型初始化为 0布尔类型初始化为false。可一旦你像上面那样写了一个带参数的构造方法默认的无参构造方法就消失了。这时候再执行new Student()就会直接编译报错。这算是我见过初学者报错频率最高的问题之一。某位同学照着网上的代码抄发现别人用了new Student(张三, 18)自己也写了个构造方法后来想创建空对象直接new Student()报错之后一脸懵“我明明没写构造方法啊怎么不能用”——原因就是你写了带参构造方法默认的无参构造方法就被覆盖掉了。如果确实需要无参构造请显式写出来。3.1 构造方法重载一个类可以有好几种出厂方式构造方法跟普通方法一样也支持重载——只要参数列表不同就可以定义多个构造方法。class Student { String name; int age; Student() { } Student(String name) { this.name name; } Student(String name, int age) { this.name name; this.age age; } }这样用户就可以灵活选择不知道年龄就用只传名字的构造方法全知道就用全参数的构造方法。三个构造方法都在同一个类里靠参数个数、参数类型来区分编译器会根据你调用时传入的参数自动匹配。这种设计背后的逻辑你可以理解成“为不同使用场景准备不同的初始化入口”。实际项目中我强烈建议写任何类都优先设计一个全参数构造方法调试的时候非常方便一眼就能看出这个对象是谁、带了什么数据。3.2 构造方法里居然还能调用另一个构造方法当你有多个构造方法时往往会出现重复代码。比如上面三个构造方法里有两个都在执行this.name name;。Java 提供了一种简洁写法在构造方法的第一行使用this(...)调用本类的其他构造方法class Student { String name; int age; Student() { this(未知, 0); // 调用下面的两个参数构造方法 } Student(String name, int age) { this.name name; this.age age; } }这里有个硬性规定构造方法重载之间相互调用时this(...)必须放在第一行少了这个限制编译器会直接报错。这也是很多同学正常写代码都很顺一到优化“重复构造代码”的时候就卡住的地方。4. this 到底指向谁被误解最多的关键字很多初学者背 this 的定义——“this 代表当前对象”——然后写代码的时候还是懵因为“当前对象”四个字太抽象了。我换个说法this 是“我”这个词谁调用这个方法“我”就是谁。上文中构造方法里写的this.name name;是非常典型的场景。方法的参数name和成员变量name重名了Java 遵循“就近原则”离得近的是你传进来的参数。如果你想给成员变量赋值就必须拿一个词来区分“当前对象的 name”和“参数 name”这个区分者就是this。void setName(String name) { this.name name; // 左侧是成员变量右侧是参数 }如果把this.name写成name name;那这行代码完全没有任何意义两个name都指向参数自己等于“自己给自己赋值”对象里的成员变量还是老样子。这是一个写出来不会报错但结果完全错误的经典逻辑 bug比编译报错更难排查。4.1 this 在静态方法里不存在有一个细节必须强调this只能在实例方法、构造方法、实例代码块环境中使用静态方法里是不能使用this的。逻辑上也很通顺——静态方法属于类本身类的图纸里不存在任何“具体的房子”那“我”指的又是谁呢这个问题我几乎每隔一段时间就会在技术群里看到新人问一遍“为什么我这个静态方法里用了 this 直接报错”再次提醒这不是所谓的“限制”而是根本矛盾。class House { String color; static void badMethod() { // this.color blue; // 编译错误 } void goodMethod() { this.color blue; // OK } }4.2 链式调用让 this 作为返回值this 的另一个实用场景是作为返回值实现链式调用。常见的 setter 方法返回void意味着调用完就结束了如果把 setter 的返回值改成this你就能写成一行接一行的风格class House { String color; int floorCount; House setColor(String color) { this.color color; return this; } House setFloorCount(int floorCount) { this.floorCount floorCount; return this; } }使用的时候就可以House house new House().setColor(蓝).setFloorCount(3);这种风格在 Fluent 接口设计中非常常见读起来特别像自然语言。初看可能觉得“这写法好奇怪”但一旦习惯你会爱上这种让代码行云流水的表达方式。也正因this能拿到当前对象的完整引用你才能在方法里把对象“自己”交出去交给别的对象去处理。5. 方法重载同名方法各自精彩前面提到构造方法可以重载实际上普通方法一样可以重载。重载的定义可以用一句话概括在同一个类中允许多个方法名相同但参数列表不能完全相同。参数列表不同包括三种情况参数个数不同、参数类型不同、参数顺序不同。比如要为“打印用户信息”这个功能设计两个方法一个接受字符串参数一个接受用户对象。名字都叫print但处理逻辑不同这就是重载的典型应用。class Printer { void print(String text) { System.out.println(字符串: text); } void print(int number) { System.out.println(数字: number); } void print(String prefix, int number) { System.out.println(prefix : number); } }调用的时候编译器会根据你传入的参数类型、个数自动“挑出”最匹配的那一个这被称为静态分派。5.1 重载 vs 重写两字之差天壤之别重载和重写Override是面向对象里最容易混淆的一对概念面试也爱问。重载出在同一个类里是编译期的行为重写发生在父子类之间是运行期的行为。这一篇我们讲的是类和对象的基础部分但提前把这个区分放在这里能帮你避免后面学继承时产生混乱对比项方法重载方法重写发生位置同一个类中子类和父类之间方法名相同相同参数列表必须不同必须相同返回类型无要求必须兼容绑定时机编译期运行期简单记忆口诀重载是自己家的事重写是父子之间的事。5.2 重载时 null 参数会匹配谁有一个相当阴间的重载陷阱看起来不起眼但在实际编码里真的坑过不少人class OverloadDemo { void test(String s) { System.out.println(字符串版本); } void test(Object o) { System.out.println(对象版本); } }如果调用dem.test(null)编译器会调用哪一个版本很多新手认为是String版本因为 String 更“具体”一些——实际上也确实是 String 版本。原因是 Java 会优先选择“最具体”的匹配类型String是Object的子类比Object更具体。但问题是一旦重载版本里有多个互相没有继承关系的类型比如String和Integer编译器就无法确定谁更具体直接报“歧义调用”错误。这个坑提醒我们重载方法的参数类型最好不要设计成具有父子继承关系的两个版本否则调用时传null极易引发莫名其妙的行为不如直接统一成最宽泛的类型再用内部逻辑去判断。5.3 什么时候真的需要重载设计类的时候重载的主要价值在于“同一操作接受不同形式的输入”。比如计算面积你要支持圆形、矩形、三角形三种图形的输入参数各不相同名字都叫calculateArea但参数设计不同调用方不需要记住三个不同的方法名只要记住“算面积就是 calculateArea”非常自然。不过我也建议不要滥用重载。如果一个类里同名的重载方法超过四五个调用方容易迷失代码可读性反而下降。这时可以考虑换一个表达力更强的方法名比如calculateRectangleArea和calculateCircleArea看着反而更直白。6. 初学类和对象时最容易翻车的四个实战场景最后这一部分我把自己这些年给同学、同事排过雷总结成四个最常见的实战场景。每一个都是真实编码中会撞上的问题提早知道能省不少调试时间。6.1 场景一空引用与空指针异常House h null; h.showInfo(); // 运行时爆炸NullPointerExceptionh现在是一张没有地址的纸条你拿着它去找房子当然找不到。空指针异常是 Java 初学者最早遇到的运行时异常没有之一。解决办法很朴素使用引用之前习惯性地考虑它是否为 null。尤其是从集合、方法返回值中拿来的对象更默认它是“可能为 null”的处理方式要么显式判断要么用 Java 8 的Optional包装。6.2 场景二引用传参时参数不再是复制品void paint(House h) { h.color 绿色; } House myHouse new House(); myHouse.color 红色; paint(myHouse); System.out.println(myHouse.color); // 绿色不是红色方法参数h接收的是引用变量的“复印件”但这张复印件指向的还是原来那栋房子。你在方法里通过h修改了房子的颜色外面的myHouse也会感知到。这就是引用传递的本质。如果你不想让方法内部修改影响原对象要不传的是新副本要不就把对象设计成不可变String、Integer 这类就是典型代表。6.3 场景三成员变量暴露过深外部随意篡改如果一个House有私有成员owner但某些public方法返回了内部的可变对象引用调用方就能绕过你的检查直接修改内部状态。这在设计类时会带来严重的数据安全隐患。防御性拷贝和不可变视图是常被忽略的进阶话题但有意识地在设计阶段就问自己一句“我的这个 getter 会把内部对象直接交出去吗”已经能避开大部分隐患。6.4 场景四比较对象时用错了等号对象比较是另一个高频翻车点House h1 new House(); House h2 new House(); System.out.println(h1 h2); // false因为地址值不同 System.out.println(h1.equals(h2)); // false因为默认 equals 也是比地址比较的是引用地址不是两个对象的内容是否一致。两个不同地址的 House 就算有完全相同的颜色和楼层也返回 false。要让内容相等判断成立你必须重写equals方法。这个知识点在集合查找、去重等场景中极其重要也是面试超高频考点学类和对象的时候就应该意识到“对象的相等性需要自己定义而不是天然存在。”回到整体思路上“类和对象(上)”这半篇内容核心就三件事把类当成设计图纸、把对象当成图纸的实例、把 new 当成创建实例的加工厂。搞定这三件事后面再学继承、多态、抽象类、接口你至少不会在“对象到底是什么”这个问题上栽跟头。我在给新人做代码评审的时候最高频看到的错误依然是构造方法覆盖、引用传参误用、null 未判断这老几样可见这些基础概念掌握透彻有多重要。下一篇“类和对象(下)”我们再聊静态成员、代码块、包管理以及对象生命周期的进阶内容。

相关新闻

Folia 本地歌单:3 种创建方式、M3U8 导入导出与 5 个避坑点

Folia 本地歌单:3 种创建方式、M3U8 导入导出与 5 个避坑点

Folia 本地歌单:3 种创建方式、M3U8 导入导出与 5 个避坑点 【免费下载链接】folia-major 专注于绚丽的歌词动画效果的本地音乐/navidrome/第三方多平台在线音乐播放器 项目地址: https://gitcode.com/GitHub_Trending/fo/folia-major Folia(foli…

2026/10/18 16:41:41 阅读更多 →
基于YOLOv8的外墙裂缝检测识别系统:中英文双语界面实现

基于YOLOv8的外墙裂缝检测识别系统:中英文双语界面实现

外墙裂缝检测这件事,行业内一直有个尴尬的痛点:靠人眼仰着头看、拉网格线拿笔描,效率低不说,还容易漏。无人机和云台普及之后,影像数据是不缺了,但一栋楼拍回来几百上千张照片,靠人工一张张放大…

2026/10/18 16:41:41 阅读更多 →
甘肃矢量shp数据包解析:QGIS加载、坐标系修正与GeoJSON导出

甘肃矢量shp数据包解析:QGIS加载、坐标系修正与GeoJSON导出

简介:甘肃省基础地理信息矢量数据包以Shapefile格式组织,面向GIS初学者、规划人员及地理数据分析者,可用于地图制图、空间查询与基础分析。包内共225个文件,含39组shp、shx、dbf、prj配套文件,覆盖相同数量的要素图层&…

2026/10/18 16:41:41 阅读更多 →

最新新闻

PlantUML驱动的可执行架构图设计方法论

PlantUML驱动的可执行架构图设计方法论

1. 项目概述:这不是画图,是构建可执行的逻辑骨架“diagram-design”这个词组乍一看像美术课作业,但在我过去十年带过的几十个跨领域项目里,它从来不是PPT里的装饰性插图,而是系统落地前最关键的“可执行蓝图”。我见过…

2026/10/19 0:26:02 阅读更多 →
扩展有限元XFEM从原理到C++实现:裂缝模拟与渗透率联动实战

扩展有限元XFEM从原理到C++实现:裂缝模拟与渗透率联动实战

干数值模拟这行当,最让人头秃的往往不是力学推导本身,而是建模那一关。常规有限元里,裂缝面必须跟单元边界重合,网格拓扑得迁就裂缝几何。遇到一条弯弯曲曲的裂缝倒还好,顶多多切几刀;可真到了多裂缝交叉、…

2026/10/19 0:26:02 阅读更多 →
Agent Skills深度架构解析与实战:从MCP到TaoToken的智能体能力编排

Agent Skills深度架构解析与实战:从MCP到TaoToken的智能体能力编排

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:25:02 阅读更多 →
如何将 PostgreSQL MCP 服务器与 Cursor 或 Claude 结合使用:TaoToken 统一 Key 接入实战

如何将 PostgreSQL MCP 服务器与 Cursor 或 Claude 结合使用:TaoToken 统一 Key 接入实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:25:02 阅读更多 →
那张被审稿人点赞的图是怎么做出来的?科迅捷AI(官方网站:www.kexunjie.com)有答案

那张被审稿人点赞的图是怎么做出来的?科迅捷AI(官方网站:www.kexunjie.com)有答案

想象这样一个场景:你的博士论文投稿三个月,审稿意见回来了,其中一条写着这张图设计得尤其清晰、信息量大。这是审稿人少见的正面评价,在满是修改意见的意见单里格外显眼。那张被点赞的图,到底是怎么做出来的&#xff1…

2026/10/19 0:25:02 阅读更多 →
论文里的数据分析别硬编,科迅捷AI(官方网站:www.kexunjie.com)把方法讲明白

论文里的数据分析别硬编,科迅捷AI(官方网站:www.kexunjie.com)把方法讲明白

本科论文里最常见的硬伤之一,是数据分析部分。数据是编的、图表是凑的、结论是事先想好再回头找数的。每年答辩季,老师都能听到几个自相矛盾的回答,问题几乎都出在数据不是自己做的。这一段对比一下硬编数据和认真做分析两种路径的差别&#…

2026/10/19 0:25:02 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →