深入解析 Processing 数组语法:声明、初始化与使用(Learning Processing 第 9 章) 教程文档示例工程【免费下载链接】website-archiveArchive of the Coding Train website (first version)项目地址https://gitcode.com/gh_mirrors/we/website-archive点击查看免费下载导读本篇文章以 Learning Processing 课程第 9 章第 2 节《数组语法》 为核心骨架系统讲解 Processing基于 Java中数组的三大基本操作声明Declare、初始化Initialize与使用Use。文章将结合仓库中 9.3 对象数组、9.4 数组与循环、9.5 灵活大小数组 的配套源码带你从单个变量的局限性出发掌握用数组管理成百上千个对象、用循环批量操作数据、以及用计数器模拟动态数组的完整实战方案。学完本文你将能独立写出Bubble 气泡上升这类经典数组演示程序并理解数组与循环、面向对象之间的协作模式。为什么需要数组从单个变量到批量数据在进入语法之前先回顾数组存在的意义。第 9 章开篇 9.1 What is an Array? 讲的就是什么是数组、为什么需要它。核心矛盾在于当场景中只有一两个对象时用普通变量即可但当对象数量达到几十、几百甚至上千时逐一声明变量是灾难性的。以仓库中第 8 章的 Bubble 气泡对象示例 为例处理两个气泡时我们这样写Bubble b1; Bubble b2; void setup() { size(640, 360); b1 new Bubble(64); b2 new Bubble(16); } void draw() { background(255); b1.ascend(); b1.display(); b1.top(); b2.ascend(); b2.display(); b2.top(); }注意 Bubble.pde 中这个类拥有x、y、diameter三个字段以及ascend()上浮、display()绘制、top()回到底部三个方法。如果我们需要 300 个气泡难道要声明b3到b300共 300 个变量然后在draw()里手写 900 行调用代码这显然不可行。数组正是解决这一问题的数据结构它用一个变量名持有同类型的多个元素并通过数字下标访问每个元素从而把声明变量和逐元素操作全部交给循环完成。数组的声明语法与内存分配数组语法的第一步是声明Declare。在 Processing 中声明数组的标准形式为数据类型[] 数组名 new 数据类型[元素个数];例如仓库 9.3 对象数组示例 中的声明Bubble[] bubbles new Bubble[2];这个声明可以拆解为两部分理解片段含义Bubble[]声明一个元素类型为Bubble的数组变量[]表示这是数组类型bubbles数组变量的名字new Bubble[2]在内存中分配一个能容纳2 个元素的数组容器new关键字完成真正的内存分配关于声明有几点值得强调类型是固定的数组一旦声明其元素类型就固定了。Bubble[]只能存放Bubble对象float[]只能存放float数值。Processing 与 Java 一样是强类型语言。基本类型数组如果数组元素是基本类型int、float、boolean等声明方式完全相同例如float[] xs new float[10];。这种写法在数据处理类 sketch 中极为常见。对象数组的两阶段特殊性对于对象数组new Bubble[2]只创建了数组容器本身并不会立刻创建 2 个Bubble对象。此时数组中两个槽位都是null空引用。真正创建对象是在初始化阶段用new Bubble(...)逐槽填充——这正是下一节要讲的内容。数组的初始化逐个赋值与循环赋值数组语法的第二步是初始化Initialize即把数据放进数组的各个槽位。方式一逐一下标赋值当元素很少时可以直接用下标逐个赋值。继续看 9.3 示例的 setup()void setup() { size(640, 360); bubbles[0] new Bubble(64); bubbles[1] new Bubble(64); }这里的关键点是下标从 0 开始第一个元素是bubbles[0]第二个是bubbles[1]依次类推。对于基本类型数组初始化就是直接赋值例如int[] scores new int[3]; scores[0] 95; scores[1] 87; scores[2] 99;方式二声明时直接初始化Processing 也支持在声明的同时直接给出元素列表省去new和逐项赋值float[] speeds { 0.5, 1.5, 2.5, 4.0 };这种写法尤其适合已知全部初始值的小型数组。方式三循环批量初始化推荐当元素数量多时逐一下标赋值就不现实了。标准做法是用 for 循环配合length属性批量初始化。看 9.4 数组与循环示例Bubble[] bubbles new Bubble[300]; void setup() { size(640, 360); for (int i 0; i bubbles.length; i) { bubbles[i] new Bubble(random(60)); } }这段代码同时体现了三个要点bubbles.length数组对象自带length属性表示数组容量这里是 300。用它作为循环边界比硬编码数字更安全、更不易出错。循环变量i即下标bubbles[i]在循环中依次访问bubbles[0]、bubbles[1]……直到bubbles[299]。随机参数random(60)让每个气泡的直径在 0~60 之间随机300 个气泡因此形态各异——这正是数组与循环协作带来的批量差异化效果。for 循环的具体语法可以参考课程第 6 章 6.3 For Loop 的讲解。数组的使用下标访问与批量方法调用数组语法的第三步是使用Use——通过下标读取或操作数组中的元素。这几乎总是和读取属性、调用方法结合在一起的。继续用 9.3 示例的 draw() 演示最朴素的用法void draw() { background(255); bubbles[0].ascend(); bubbles[0].display(); bubbles[0].top(); bubbles[1].ascend(); bubbles[1].display(); bubbles[1].top(); }每个元素都是一个完整的Bubble对象因此可以直接用点号调用其方法。这个版本的问题一目了然每个元素都要手写三行调用代码元素一多根本无法维护。所以实际项目中使用数组几乎总是与循环配合——见 9.4 示例的 draw()void draw() { background(255); for (int i 0; i bubbles.length; i) { bubbles[i].ascend(); bubbles[i].display(); bubbles[i].top(); } }从 9.3 到 9.4 的转变是本文的核心收获之一声明、初始化、使用这三个阶段都可以用同一套数组 循环模式实现。9.3 展示只有 2 个元素时如何硬编码9.4 则把同样的逻辑泛化到 300 个元素代码量反而更少。这正是数组存在的价值——把数据规模从常量扩展为变量让程序的处理能力不再受限于手写代码的长度。对应的 Bubble.pde 类实现如下9.4 与之几乎一致class Bubble { float x; float y; float diameter; float yspeed; Bubble(float tempD) { x random(width); y height; diameter tempD; yspeed random(0.5, 2.5); } void ascend() { y y - yspeed; x x random(-2, 2); } void display() { stroke(0); fill(127, 100); ellipse(x, y, diameter, diameter); } void top() { if (y -diameter / 2) { y height diameter / 2; } } }从源码结构看这个类的字段全部是float类型构造函数接收直径参数并用random()初始化位置与速度top()负责在气泡飘出屏幕顶部后把它重置回底部形成循环上升的视觉效果。进阶用计数器模拟灵活大小的数组标准数组一旦声明容量就固定了。第 9 章最后两节探讨的是如何在固定容量下实现动态效果。其中 9.5 灵活大小数组 介绍了一个非常实用的小技巧声明一个足够大的数组再用一个total计数器记录当前实际使用到第几个元素。看 9.5 示例源码Bubble[] bubbles new Bubble[100]; int total 0;数组容量固定为 100但total决定当前实际显示多少个void setup() { size(640, 360); for (int i 0; i bubbles.length; i) { bubbles[i] new Bubble(random(20, 40)); } } void mousePressed() { total total 1; // 点击鼠标让一个气泡生效 } void keyPressed() { total total - 1; // 按键让一个气泡失效 } void draw() { background(255); for (int i 0; i total; i) { bubbles[i].ascend(); bubbles[i].display(); bubbles[i].top(); } }这里的技巧在于setup()中一次性把所有 100 个气泡都创建好数组的每个槽位始终非空因此不存在访问null的风险。mousePressed()与keyPressed()只调整total通过增减计数来模拟数组大小的变化。total相当于可见元素的边界。draw()中的循环以i total为边界只遍历、绘制前total个气泡从而让画面中的气泡数量随鼠标点击和按键动态增减。这种固定数组 计数器方案是理解后续append()函数和ArrayList见 9.5 文档中引用的 《ArrayLists in Processing》 视频的跳板当元素需要真正增删而非仅显隐时就可以升级为ArrayList这类可动态扩容的集合类型。常见错误与排查要点基于上述源码模式初学者最容易踩的坑集中在以下几点下标越界ArrayIndexOutOfBoundsException数组容量是length合法下标范围是0到length - 1。写成i bubbles.length会访问到bubbles[bubbles.length]必然越界。循环边界应始终是i length。对象数组元素未初始化NullPointerExceptionnew Bubble[300]之后、new Bubble(...)之前数组元素是null。此时调用bubbles[i].ascend()会抛出空指针异常。务必在draw()之前完成所有元素的初始化或者像 9.5 那样在setup()里一次性创建全部对象。下标从 0 开始很多新手把第一个元素当成[1]导致浪费第 0 号槽位或访问到不存在的最后一个槽位。在draw()中重复new数组如果每次draw()都重新new Bubble[300]会导致每帧重建全部对象性能低下且画面闪烁。数组的声明与初始化应当放在setup()或全局作用域中完成一次。总结数组语法的三步心法结合 9.2 数组语法 的教学主题与本仓库配套源码可以把 Processing 数组的使用归纳为三步心法声明DeclareType[] name new Type[n];——确定元素类型与容量分配内存容器初始化Initialize用下标逐项赋值或用for (int i 0; i name.length; i)循环批量填充对象数组必须逐个new使用Use通过name[i]读取属性、调用方法同样以循环 length或计数器total驱动批量操作。这三步在仓库中的演进路径非常清晰9.3 对象数组 演示硬编码两个元素的完整流程9.4 数组与循环 把同样逻辑泛化到 300 个元素9.5 灵活大小数组 引入计数器让数组看起来可伸缩。配套源码分别位于 Tutorials/Processing/9.3-array-of-objects、Tutorials/Processing/9.4-arrays-and-loops 与 Tutorials/Processing/9.5-flexible-arrays读者可以直接打开这些 sketch 运行、修改参数如把300改成1000、把random(60)的取值区间调大在实践中巩固数组语法。掌握这三步之后下一阶段就可以向对象数组 循环 动态增删的组合能力ArrayList继续进阶。赞分享教程文档示例工程【免费下载链接】website-archiveArchive of the Coding Train website (first version)项目地址https://gitcode.com/gh_mirrors/we/website-archive点击查看免费下载相关推荐深入 linux-insidesLinux 进程资源限制 getrlimit / setrlimit / prlimit 系统调用解析深入 linux insidesLinux 进程资源限制 getrlimit / setrlimit / prlimit 系统调用解析 本文是 linux i教程文档示例工程TypeScript 3.1 特性详解元组映射类型、函数属性声明与 typesVersions 版本选择TypeScript 3.1 特性详解元组映射类型、函数属性声明与 typesVersions 版本选择 本篇文章围绕 TypeScript 3.1 的三个核教程文档示例工程P1xt Guides v6.1 五层编程课程体系全解析一条从 Web 基础通向计算机科学深潜的免费自学路线P1xt Guides v6.1 五层编程课程体系全解析一条从 Web 基础通向计算机科学深潜的免费自学路线 P1xt Guides 是开源仓库 p1xt g教程文档示例工程上一篇AI-Infra-Guard MCP 动态信息收集 Agent 提示词工程基于 tools 描述的可追溯服务画像与攻击面预判下一篇Aspire aspireify 技能评估实战aspireify-eval 测试套件与 aspire init 遗留应用改造指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考