Java自学第二天:从变量、运算符到数组与方法的语法实战

📅 发布时间:2026/10/5 8:04:00
Java自学第二天:从变量、运算符到数组与方法的语法实战
如果第一天是装 JDK、配环境变量、在控制台里看着 Hello World 蹦出来那第二天才算真正开始和 Java过日子。我在自学 Java 的第一天晚上就在想光会打印一句话离用 Java 解决问题还差着十万八千里。第二天我给自己定的任务很简单——把语法地基打牢从变量、数据类型、运算符、流程控制一直延伸到数组和方法并且亲手写出两个有实际意义的小程序。这篇文章就是我在这个阶段的学习笔记和踩坑实录适合和我一样刚过完入门、准备啃语法核心的 Java 自学者参考。1. 第二天的定位从Hello World到第一段有逻辑的程序1.1 第一天的回顾环境变量和 JDK 安装那些事严格说我第一天只完成了三件事下载 JDK、配环境变量、跑通第一个 Java 程序。哪怕到了第二天我依然觉得环境配置是劝退率最高的环节没有之一。很多人在命令行里敲java -version没反应或者编译时提示javac不是内部或外部命令十有八九是环境变量里的JAVA_HOME和PATH没配对。我当时在 Windows 11 上配置环境变量时踩过一个特别典型的坑只配了PATH却没有新建JAVA_HOME。后来才知道像 Maven、Tomcat 这些后续要用的工具默认都会去读取JAVA_HOME变量。所以第二天一大早我做的第一件事就是把环境变量重新收拾了一遍# Windows 环境变量参考配置 JAVA_HOME: C:\Program Files\Java\jdk-17 PATH 新增: %JAVA_HOME%\bin配置完成后一定要开一个全新的命令行窗口再验证因为旧窗口读取的还是旧的环境变量。我用java -version和javac -version两条命令确认编译器和运行环境都正常这才放心进入第二天的正式学习。1.2 第二天的目标搭建完整的语法骨架第一天我虽然跑通了 Hello World但那个程序本质上只是复制粘贴加运气。第二天我不想再靠死记硬背混过去所以给自己定了四个明确目标搞清楚变量和数据类型是怎么回事、能看懂并写出运算符和流程控制的代码、掌握数组的声明遍历和边界问题、学会定义方法并完成两个小实战。这四个目标其实对应着 Java 语法的四个核心零件数据怎么存、逻辑怎么走、批量数据怎么管理、功能怎么复用。我把它想象成搭乐高——第一天只是打开了盒子第二天要把最常用的几个积木块挨个摸熟。事实证明这个定位是准确的因为后面学面向对象时几乎天天都要和这些基础零件打交道。2. 变量与数据类型先搞清楚数据在内存里长什么样2.1 八种基本数据类型怎么记才不会到用的时候发懵Java 是一种强类型语言意思是每个变量在声明时就必须明确类型。第二天打基础时我把 Java 的八种基本数据类型分成了四类来记整型byte、short、int、long、浮点型float、double、字符型char、布尔型boolean。这样分类记忆比逐个死记要轻松得多。其中最容易犯迷糊的是取值范围问题。int默认是 4 字节取值范围大约在正负 21 亿左右而long是 8 字节适合表示更大的整数。不过有个细节绝大多数新手都会忽略直接写一个整数常量它的默认类型就是int。如果要把一个超出int范围的数字赋值给long变量必须在数字后面加L后缀否则编译直接报错。// 这样写没问题 long mySalary 300000L; // 这样写会编译报错过大的整数 // long wrong 3000000000;浮点数也有类似的讲究。小数字面量的默认类型是double如果你非要用float必须加f后缀。我第二天就因为偷懒漏掉f被编译器教育了一次从此记住了这个规则。2.2 类型转换和精度丢失新手最容易忽略的暗坑类型转换在 Java 里分两种自动转换和强制转换。自动转换发生在从小范围类型向大范围类型赋值时比如int转long、int转double系统会自动完成不需要额外处理。但反过来从double转int、从long转int这种大范围向小范围的转换就必须显式加上括号强转。强转最需要警惕的是精度丢失。我在练习时就写过这样的代码int total 7; int count 2; double avg total / count; // 结果是 3.0不是 3.5这就是第二个经典暗坑如果除号两边都是整数Java 会先执行整数除法把小数部分直接丢掉然后再转成double。要想得到 3.5必须至少让其中一个操作数变成浮点数比如total * 1.0 / count或者(double) total / count。这个坑我在后面写计算平均成绩时又碰到了一次属于那种教材上写过、但不动手就永远记不住的细节。2.3 标识符命名规则第一天就该养成的习惯第二天学变量时命名规则是必考内容。规则本身不复杂标识符只能由字母、数字、下划线和美元符号组成不能以数字开头不能是 Java 关键字。但真正重要的不是背规则而是养成见名知意的编码习惯。我见过很多自学者的变量名叫a、b、c代码写完之后过两天自己都看不懂。我当时给自己定了一条硬规矩变量名一律用驼峰命名法比如studentScore、maxValue方法名用小写驼峰类名用大写驼峰。虽然第二天还没学到类但这个习惯越早建立越好。另外我还记住了几个容易踩雷的合法但诡异的命名比如$开头是合法的课堂上几乎不会提醒但实际项目中极少会这么用知道有这回事就行。3. 运算符与流程控制让代码学会拐弯3.1 运算符优先级与其硬背不如用括号锁死Java 的运算符数量不少算术、赋值、比较、逻辑、三目加在一起有三十多个。我第一遍看优先级表格时头都大了后来想通了一件事实际写代码时与其纠结和||谁先执行不如直接用括号把优先级锁死。括号不光是语法规则更是给人读的——两个月后你回来看自己的代码括号能帮你省下大量回忆时间。不过有几个优先级问题是必须刻在脑子里的。第一和--的前置后置区别i是先使用后自增i是先自增后使用。第二逻辑与和逻辑或||存在短路机制false 任意表达式直接返回 false后面的代码根本不会执行。这个特性在做条件判断时非常有用比如判断一个字符串是否非空再调用它的方法写str ! null str.length() 0就不会出现空指针。3.2 if/else 与 switch 的选择不要只是能用流程控制是第二天的主战场因为程序从这里开始有了分支。if/else和switch都能做条件判断但适用场景不同。if/else更适合范围判断比如成绩等级划分——90 分以上是优秀80 到 90 是良好switch更适合等值判断比如根据匹配单的数字 1、2、3 执行不同逻辑。我在学习switch时踩过一个老生常谈的坑忘记写break。Java 的switch在匹配到某个分支后如果没有break会继续往下执行下一个分支这就是所谓的穿透。后来看了 JDK 12 之后的写法才发现新语法用-代替冒号天然不需要break代码清爽很多。但考虑到网上很多教程和面试题还在用传统写法这两种语法我都练了一遍强烈建议新手两种都看一眼。3.3 for 和 while数量固定用 for条件驱动用 while循环这块我给自己总结了一条选择逻辑知道要循环多少次用for不知道次数、只知道结束条件用while。比如遍历一个长度为 5 的数组铁定用for写一个猜数字直到猜中为止的小游戏用while更自然。第二天最容易翻车的不是语法记不住而是边界条件没想清楚。我写第一个for循环时习惯性地写成了for (int i 1; i 10; i)这没错。但遍历数组时很多人会写成i array.length这就会越界。数组下标从 0 开始到length - 1结束所以遍历条件应该是i array.length。这个细节我在下一节会展开讲因为它是第二天所有程序里出现频率最高的 bug。4. 数组与方法第二天最该啃下来的两个硬骨头4.1 数组定长、索引、越界三件事一次搞清楚数组是 Java 里第一个真正意义上的批量数据管理工具。它的特点就一个一旦声明长度就不能再变了。比如int[] scores new int[5];这 5 个元素的初始值默认全是 0。新手常常被这个问题迷惑以为没赋值就是空的实际上基本类型数组会自动填充默认值int是 0double是 0.0boolean是 false。数组的索引从 0 开始最后一位是length - 1。我第二天在练习中频繁遇到的一个异常就是ArrayIndexOutOfBoundsException也就是数组越界。一旦你用不存在的下标去访问元素JVM 就会抛出这个异常并终止程序。这个异常是学习 Java 过程中最早撞见的一批异常之一看见它不用慌解决方法就三步检查下标是否从 0 开始、检查循环条件是不是 length而不是 length、确认没有把固定长度数组当成可动态增长的集合来用。4.2 方法返回值、参数传递、重载的入门理解方法这个概念我把它理解成把一段功能打包起来起了个名字随时调用。方法的组成包括访问修饰符、返回值类型、方法名、参数列表和方法体。第二天不需要纠结public和private的区别先把方法怎么写、怎么调用、怎么返回结果搞清楚。参数传递是新手比较容易懵的地方。Java 的参数传递本质上是值传递——传递的是变量的副本。对于基本类型方法内部修改参数不会影响外部变量对于引用类型比如数组、对象传递的是引用的副本方法内部透过引用修改对象内容外部是能感知到的。这个区别我一开始根本没理解直到练习了一个方法内部交换两个变量的程序后才发现交换外面根本不变这才彻底记住了值传递的含义。方法重载也值得在第二天先混个脸熟同一个方法名参数列表不同个数或类型不同这就是重载。典型例子是System.out.println()它能打印字符串、整数、小数靠的就是重载机制。知道这个概念往后再学继承多态时会轻松很多。4.3 实战一计算平均成绩第二天快结束时我已经掌握了变量、运算符、数组、循环、方法这些零件于是决定做两个小实战来检验成果。第一个实战是计算平均成绩。这个需求很常见输入若干学生的成绩求平均值。我写第一版代码时正好把整数除法那个坑踩了个正着——算出来永远是个整数后来改成(double) sum / count才得到正确结果。下面是我整理后的练习代码public class AverageScore { public static void main(String[] args) { int[] scores {85, 92, 78, 90, 88}; double avg getAverage(scores); System.out.println(平均分 avg); } public static double getAverage(int[] arr) { if (arr null || arr.length 0) { return 0; } int sum 0; for (int i 0; i arr.length; i) { sum arr[i]; } return (double) sum / arr.length; } }这段代码里我刻意加了一个arr.length 0的判断。虽然这只是练习程序但这个习惯很重要——实际项目中拿到外部传进来的数组第一件事就是判空和判长度否则后续操作随时可能抛异常。4.4 实战二冒泡排序第二个实战是冒泡排序。这是排序算法里最基础的一个也是面试题里的常客。它的核心思想很简单每一轮从头到尾两两比较把大的往后移动就像气泡一样慢慢浮到末尾。我刚开始写冒泡排序时以为理解了原理就能写对结果连续报错三次。问题出在外层循环和内层循环的边界上。正确的写法是外层循环跑arr.length - 1轮内层循环每轮比较arr.length - 1 - i次因为每轮结束后末尾的元素已经排好不再参与比较。public static void bubbleSort(int[] arr) { for (int i 0; i arr.length - 1; i) { for (int j 0; j arr.length - 1 - i; j) { if (arr[j] arr[j 1]) { int temp arr[j]; arr[j] arr[j 1]; arr[j 1] temp; } } } }写完之后我又加了一个小小的优化如果某一轮没有任何交换发生说明数组已经有序可以直接break跳出循环。这个优化虽然对 5 个元素的数组没什么意义但它让我养成了先跑通、再优化的习惯。5. 第二天最容易踩的坑从环境问题到逻辑错误5.1 环境变量没生效、javac 找不到先做这三步排查第二天学习过程中我的学习群里至少有四个人遇到了同样的问题头一天明明把 Hello World 跑通了第二天打开命令行再编译却提示javac不是内部或外部命令。这个问题的根源几乎都是环境变量问题排查顺序就三步。第一步重新打开一个命令行窗口旧窗口不会刷新环境变量。第二步在命令行里执行echo %JAVA_HOME%看是否输出了正确的 JDK 安装路径。第三步检查PATH里是否包含%JAVA_HOME%\bin。如果这三步都没问题再看一眼 JDK 和项目的位数是否匹配但绝大多数情况前三步就解决了问题。5.2 数组越界异常不要只盯着报错那一行ArrayIndexOutOfBoundsException是第二天最高频的老朋友。我记得自己第一次看到这个异常时盯着报错行看了半天也没发现问题后来才发现是前面循环的边界多写了一。这里有一个通用的排查思路先看报错信息里的Index 5 out of bounds for length 5这种提示它会直接告诉你用了下标 5而数组长度只有 5所以合法下标是 0 到 4然后回到循环条件检查是不是写成了或者把数组长度当成最大下标来用了。解决数组越界最稳的方法就是统一写成for (int i 0; i arr.length; i)这个写法可以直接消灭 90% 的越界问题。等以后学到ArrayList还会有新的边界问题但遍历一律用下标小于长度这个原则是通用的。5.3 自学第二天的三个心态建议最后分享三个我在第二天踩坑后总结出来的心态建议。第一语法细节记不住没关系但要能意识到这里有坑。比如整数除法会丢失精度、数组下标从 0 开始、switch可能穿透——这些细节不需要全背下来但遇到异常要有排查方向。第二一定要动手敲代码。我看教程时觉得自己全会了一写就废平均成绩那个程序我删掉重写了三遍才算真正理解。第三学会看报错信息。Java 的异常信息已经是非常友好的提示了把异常类型和报错行号结合起来看大部分问题都能自行解决。6. 第二天结束后的下一步面向对象与常用容器的预习思路第二天的内容练完之后我对 Java 语法基础已经有了一个完整的骨架认知。接下来的第三天就要开始啃面向对象编程这块硬骨头了。这个阶段要做好心理准备因为思维要从以方法为中心切换到以对象为中心难度比第二天翻了好几倍。预习时可以只做三件事第一搞清楚类和对象的关系——类是模板对象是模板造出来的实例第二理解封装的作用为什么要把数据藏在对象内部第三看一眼ArrayList和数组的区别——数组是定长的ArrayList可以动态扩容这就是后面常用容器的基础。这块内容学完之后才谈得上用 Java 去解决真实业务问题比如连接数据库、做接口自动化测试、写定时任务框架这些热搜词里的场景。我在第二天的最后一个练习是把冒泡排序封装进一个方法然后再写一个方法打印数组内容。虽然只是把两段代码拼在一起但看到 main 方法里干净整洁的几行调用时我第一次感受到了封装带来的爽感。这种把复杂逻辑藏起来、对外只暴露简单接口的体验就是 Java 后面所有设计思想的原点。