ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Java第二天学习指南:数据类型、运算符与流程控制实战

Java第二天学习指南:数据类型、运算符与流程控制实战 说实话第二天是最容易劝退人的一天。第一天装好了JDK跑通了Hello World新鲜感还在到了第二天突然要面对变量、数据类型、运算符、流程控制这些硬邦邦的语法规则很多人就是在这里开始觉得“Java怎么这么麻烦”“我是不是不适合学编程”。作为用Java写了十年代码的人我想说第二天觉得难太正常了。这一天的内容恰好是从“看热闹”转向“写门道”的分水岭熬过去后面就是一马平川。这篇东西就是写给正处于第二天的你。我会按一个过来人的视角把第二天真正该学的东西拆开揉碎讲清楚——不是让你背语法而是告诉你每个知识点解决什么问题、背后是什么逻辑、代码该怎么写到能跑且不踩坑的程度。文中涉及的数据类型、运算符、流程控制、实战小项目都是我在带新人时反复强调的核心内容也是网上那些“Java八股文”里最常见的考点你现在打牢了后面面试会省很多事。1. 第二天到底该学什么从“看懂代码”到“写对语法”很多自学Java的朋友有个误区觉得第二天就该开始啃面向对象、集合、框架了。我见过不少新人第一天刚打印完Hello World第三天就开始问Spring Boot怎么搭结果连if和for都写不利索后面越学越虚到面试时被一句“讲讲HashMap原理”直接问懵。第二天最该干的事情其实只有三件把Java的基础语法吃透、把IDE用顺手、把“代码是写给机器看的更是写给人看的”这个意识建立起来。语法这东西说穿了就两类一类是描述数据的变量、数据类型、运算符、表达式一类是控制流程的if、switch、for、while。把这两类搞明白你已经具备写任何简单逻辑程序的底子了。1.1 为什么第二天不建议直接冲面向对象我理解你想快点写出“像样”的程序但面向对象类、对象、继承、多态是建立在语法基础之上的思维方式你连变量作用域都没搞清上来就new一个对象出错了都不知道该查哪一行。打个比方学Java就像学开车第一天你学会了点火起步Hello World第二天应该练的是踩刹车、打转向灯、看后视镜语法规则第三天才能上路跑写小型逻辑面向对象是后面才学的“怎么规划路线、怎么看地图”。直接上高速不是不行但风险极高而且容易养成不求甚解的习惯——代码能跑就行原理是什么完全不知道。这个习惯一旦养成后面改bug会非常痛苦。1.2 第二天的时间分配建议实测有效我自己的经验和带新人的数据表明第二天比较合理的时间分配是这样的两到三个小时搞懂数据类型和变量两三个小时搞懂运算符和表达式四五个小时主攻流程控制并配合大量练习最后留出一两个小时做一个综合小项目。一天大约八到十个小时刚好能完成“输入-理解-输出”的闭环。注意这里说的是“输出”。光看书看视频不写代码就像看别人游泳自己在岸上比划下水照样呛。我一向要求新人每天至少亲手敲两百行代码哪怕是在照着抄抄完也要自己默写一遍。第二天正是培养这个习惯的最佳时机。2. Java数据类型理解“箱子里能装什么”是写好一切逻辑的前提数据是程序的基础Java作为强类型语言对数据的“形状”要求极其严格。所谓强类型就是Java要求每个变量在声明时必须明确它能装什么类型的数据不能像JavaScript那样随便把一个数字赋值给一个字符串变量。“严格”恰恰是Java的优势很多bug在编译阶段就被拦住了而不是运行时才爆出来。2.1 八大基本数据类型一张表记住核心差异Java的8种基本数据类型是第二天必背的内容面试题里翻来覆去考的就是它们的取值范围和默认值你现在记住了后面能省不少功夫。数据类型字节数取值范围默认值典型用途byte1-128 ~ 1270二进制流、文件字节读取short2-32768 ~ 327670极少用了解即可int4-21亿 ~ 21亿0整数默认类型最常用long8极大约正负900亿亿0L时间戳、超大数值计算float4约正负3.4E38精度7位0.0f单精度小数日常很少用double8约正负1.7E308精度15位0.0小数默认类型最常用char20 ~ 65535\u0000单个字符用单引号括起来boolean1理论上true/falsefalse条件判断标志位这里有一个最容易被新人忽视的点所有整数默认都是int类型。也就是说你写100这个字面量在Java眼里它就是int。如果你想把一个整数赋值给long变量超过int范围就必须加L或者l后缀不然编译直接报错。同理小数默认是double想赋给float变量要加f后缀。我见过太多人在这个细节上栽跟头明明代码逻辑没问题编译就是过不去。2.2 引用类型和基本类型的区别抽屉与通讯录的比喻理解了基本类型再来说说引用类型。String、数组、后面要学的所有类对象都属于引用类型。两者的核心区别我用一个生活化类比来解释。基本类型变量就像一个抽屉你往里面放一张写着数字的纸条用的时候直接把纸条拿起来看。引用类型变量则像一本通讯录每个格子记的不是本人信息而是这个人“住在哪儿”内存地址。你用通讯录去找人其实是通过地址去访问。这个区别解释了后面很多经典问题比如为什么两个String用比较有时候是true有时候是false比较的是地址而不是内容、为什么把一个对象赋值给另一个变量后修改一个另一个也变了两个变量指向同一个地址。你可能说第二天我哪知道这些有什么用有而且有大用。你马上就会遇到String字符串拼接、数组遍历如果不知道“String是不可变的、每次拼接都产生新对象”这个特性你就理解不了为什么循环里拼字符串性能会很差也不明白为什么格式规范里老强调用StringBuilder这是热词里提到的后面会细说。基础概念之间是环环相扣的现在偷的懒都是后面要补的债。2.3 变量的声明规则和命名规范好的命名能帮你少掉一半头发声明变量的语法很简单数据类型 变量名 值;。比如int age 18;、double price 9.99;、String name 张三;。难的是养成好习惯。Java对变量名的硬性要求就几条不能以数字开头不能使用关键字int、class、public这些不行大小写敏感age和Age是两个变量可以使用下划线但规范上不建议用从JDK 8开始下划线单独作为变量名已经被移除了主要是想留作未来语法扩展用你老老实实用驼峰命名就行。这些规则踩一次就记住了但真正让代码“值钱”的是软性规范变量名必须见名知意。int a 100;和int accountBalance 100;哪个让人看了不头疼一目了然。这就是我说的“代码是写给人看的”。你自己写的代码三天后回头看可能都陌生更别说同事和面试官了。程序员的水平往往从变量命名就能看出八成。3. 运算符与表达式Java是怎么“算”的运算符是Java对数据进行加工处理的工具数学运算、逻辑判断、赋值操作全靠它。第二天的运算符学习主要集中在三大块算术运算符、赋值运算符、关系与逻辑运算符。别觉得这块简单就跳着看里面藏着好几个专门考新人的坑。3.1 整数除法陷阱凭什么5除以2等于2算术运算符包括加减乘除 - * /和取余%。新人最常踩的坑就是除法Java里两个整数相除结果还是整数小数部分直接丢掉注意不是四舍五入是直接截断。所以5 / 2的结果是2不是2.5。想得到2.5至少要有一个操作数是浮点数比如5 / 2.0或者(double) 5 / 2。这个规则看起来简单但它解释了无数线上bug。比如你在计算平均分totalScore / studentCount总分和人数都是int算出来的平均分永远是整数90.5分会变成90。我在实际项目里真的见过因为这个逻辑算错了奖金金额的情况不是开玩笑。取余运算符%也是个好东西它求的是整除后的余数。判断一个数是偶数还是奇数用num % 2 0判断一个年份是不是闰年用(year % 4 0 year % 100 ! 0) || year % 400 0取一个三位数的个位十位百位也可以靠取余和除法配合。这些是第二天的经典练习题写一遍就忘不了。3.2 自增自减a和a的区别调试器的老朋友自增自减--是最容易让新手混乱的运算符。i是先使用i的值再让i加1i是先让i加1再使用新值。单独写一行的时候没区别一旦放进赋值语句或条件判断里就天差地别。int a 5; int b a; // b 5, a 6 int c a; // a 7, c 7面试爱考这个但说实话实际开发中不建议把自增自减写进复杂表达式里可读性太差还容易跟别人交接时说不清。自己写着玩可以用维护的项目里最好别这么秀你说呢。3.3 与equals的恩怨第二天可以先留个心眼关系运算符里比较的是“值”还是“地址”取决于操作数类型。基本类型比较值引用类型比较地址。所以两个内容都是hello的String对象用 比较大概率是false除非它们指向同一个对象。正确的字符串比较要调用equals方法str1.equals(str2)。这个知识点明天学String的时候我会展开细说今天你先知道结论就行以后在Java里判断两个字符串是否相等一律用equals别用。提前了解这个坑能让你在写作业的时候少走好多弯路。另外提一句先给字符串赋固定值字面量再和new出来的字符串对象比较结果往往是false到时候别懵原因就是上面说的地址问题。3.4 短路逻辑和||的隐藏行为写出健壮条件的好帮手逻辑运算符短路与、||短路或有个特性叫“短路求值”Java会从左往右计算一旦结果能确定就不继续算了。条件1 条件2如果条件1是false整个表达式必然是false条件2根本不会执行。同理条件1 || 条件2中条件1为true时条件2不会执行。这个特性不仅是为了性能更重要的是能避免一些运行时错误。比如你要判断一个字符串非空且长度大于3可以写成str ! null str.length() 3。因为短路效应str为null时不会执行后面的str.length()所以不会触发空指针异常。你要是用非短路逻辑与那就等着报错吧。这种写法在后期的项目里天天用第二天就养成习惯受益无穷。4. 流程控制让程序学会“思考”的关键一步数据有了、运算符也会了接下来要让程序根据条件做决策、反复执行某段操作。这就是流程控制顺序执行、条件分支、循环。这是第二天的重头戏也是你从“会写代码”迈向“会写逻辑”的重要一步。4.1 if分支永远想不到的错误是把else贴错if语句的语法很简单条件成立时执行一段代码不成立时执行另一段。它解决的是“如果怎么样就怎么样”的问题。比如int score 85; if (score 90) { System.out.println(优秀); } else if (score 60) { System.out.println(及格); } else { System.out.println(不及格); }这里要特别强调两件事。一是“就近匹配”陷阱如果一个if代码块里没有加花括号那这个if只管辖紧随其后的一条语句。我自己就见过新人把它写成if (score 90) System.out.println(优秀); System.out.println(看成绩单);后一句成了无条件执行结果成绩不及格也能看到“看成绩单”。所以哪怕只有一条语句也建议加上花括号这是个终身受益的习惯。二是判断顺序的问题。判断成绩时要有一个先大的意识先判断90分以上再判断60分以上最后是else兜底。你要是把顺序倒过来先判断score60那所有大于60的分数都进了“及格”分支90分的“优秀”永远没机会执行。这种逻辑顺序意识恰恰是程序员和普通人的重要差异之一。4.2 switch分支JDK版本演进带来的新写法和老坑switch适合做离散值的多分支判断比一堆if else if看着清爽。JDK 7以前只支持int等整数类型JDK 7开始支持StringJDK 14之后还引入了箭头表达式和switch表达式写法简洁了很多。不过第二天学switch重点先放在经典写法上int day 3; switch (day) { case 1: System.out.println(周一); break; case 2: System.out.println(周二); break; default: System.out.println(其他); }这个语法的核心陷阱就一个break忘了写就会“穿透”。就是说你匹配到case 3如果没有break它会继续执行case 4、case 5……直到遇到break或switch结束这在很多场景下不是你想要的。热词里提到的“switch 空数据”我理解常指的就是这种case穿透后得到意外结果的问题调试的时候极其隐蔽。顺便提一句JDK 12之后的写法可以这样写case 1 - System.out.println(周一);箭头右边是执行的语句每一路自动break不用写大括号。实际项目里我会更推荐这种新写法简洁也不容易错。但面试时老写法居多两种都别落下。4.3 for和while循环别把边界条件做错少跑一次和无限循环一线之隔循环解决的是“重复做某件事”的需求遍历一个数组、累加一堆数字、输出一张九九乘法表统统离不开循环。for循环的语法结构是for (初始化; 循环条件; 步进)三个部分负责的是“从哪里开始”、“满足什么条件继续”、“每次循环后做什么变化”。新人最常见的错误是边界条件写错。比如遍历长度为5的数组下标从0到4有人写成for (int i 1; i 5; i)数组下标越界直接报错也有人写成for (int i 0; i 5; i)最后丢了一个元素。我的经验是遍历数组就用i 数组长度别用小于等于这个习惯能帮你避开一堆数组越界的Exception。while循环适合“不知道循环多少次”的场景比如一直读用户输入直到遇到q才退出或者登录失败时反复重试直到次数用完。和do-while相比while先判断后执行do-while先执行后判断哪怕条件一开始就不满足do-while也至少执行一次。实际开发中while用得多do-while相对少但“至少执行一次”的语义有时非常合适比如菜单展示一定要先显示一遍。4.4 课后必练的经典题冒泡排序的“为什么”流程控制学完可以练一个非常经典的小算法冒泡排序。它的思路很简单在一个数组里比较相邻两个数把大的往后挪。一趟下来最大的数到了最后。重复这个过程直到所有数排好序。int[] arr {5, 1, 4, 2, 8}; 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; } } }这段代码里有三层东西值得琢磨外层循环要跑几轮n-1轮、内层循环每一轮要比较多少次不断减少因为最大值已经沉底了、为什么要用中间变量temp做交换。能把这三点讲清楚说明你对循环已经理解到位了。冒泡排序本身是面试基础题也是热词里“java排序”的入门代表。你现在手写一遍比背十遍八股文都管用。5. 手把手实战用第二天所学做一个“模拟ATM取款机”理论说了一堆不动手等于白说。我这里给你一个完全用第二天的知识就能做出来的小项目一个命令行版的简易取款机。它能演示变量、数据类型、运算符、if、switch、while、Scanner输入这些今天学的全部内容。你照着敲一遍再自己改一改比你看十个小时视频都强。5.1 项目需求先把要做什么想清楚这个程序要完成这样几个功能初始化一个账户余额比如5000.0元和一个密码比如123456提示用户输入密码只有三次机会输错了就退出密码正确后进入主菜单显示1查询余额、2存款、3取款、4退出存款就是把输入的金额加到余额上取款要判断余额够不够不够就提示“余额不足”取款成功后余额减少。操作完成后回到菜单直到选择4退出。这需求看着不难但要把逻辑理顺恰好训练了你用Java“翻译”现实需求的能力。这就是面向过程编程的精髓所在。5.2 关键代码实现一步一步写出来先导入Scanner并创建对象用来读取控制台输入import java.util.Scanner; public class ATMDemo { public static void main(String[] args) { Scanner scanner new Scanner(System.in); double balance 5000.0; int password 123456; boolean loggedIn false; // 三次登录机会 for (int i 0; i 3; i) { System.out.print(请输入密码); int input scanner.nextInt(); if (input password) { loggedIn true; break; } else { System.out.println(密码错误还有 (2 - i) 次机会); } } if (!loggedIn) { System.out.println(三次密码错误账户已锁定程序退出。); return; } // 主菜单循环 while (true) { System.out.println( ATM 主菜单 ); System.out.println(1. 查询余额); System.out.println(2. 存款); System.out.println(3. 取款); System.out.println(4. 退出); System.out.print(请选择); int choice scanner.nextInt(); switch (choice) { case 1: System.out.println(当前余额 balance); break; case 2: System.out.print(请输入存款金额); double deposit scanner.nextDouble(); balance deposit; System.out.println(存款成功当前余额 balance); break; case 3: System.out.print(请输入取款金额); double withdraw scanner.nextDouble(); if (withdraw balance) { System.out.println(余额不足当前余额为 balance); } else { balance - withdraw; System.out.println(取款成功当前余额 balance); } break; case 4: System.out.println(感谢使用再见); return; default: System.out.println(无效选择请重新输入); } } } }这段代码每一行用到的都是今天学的知识点定义变量、Scanner读取输入、for循环控制三次机会、if判断密码、while实现反复显示菜单、switch分支处理不同操作。你把它完整跑通了就会非常有成就感而且会发现原来写程序不是背代码而是组织逻辑。5.3 对这段代码进一步思考哪些地方可以优化代码写出来只是第一步第二天就该开始培养“回头看”的习惯。比如密码现在用int类型如果用户想设置“000000”这样的密码int会丢失前导零用String更合理余额用double会存在浮点数精度问题真实金融系统用BigDecimal这个知识点可以在后面深入登录失败三次后只是退出程序其实可以用一个for循环记录错误次数次数用尽时用return跳出main方法这是目前最简单的处理方式。这些问题现在不用急着全解决但“能意识到这里有优化空间”和“完全无感”是有区别的。前者说明你在用程序员的脑子思考了。6. 第二天常见问题排查环境变量、中文乱码和“代码看着没问题但不对”第二天我收到过最多的问题就三类环境没配好导致跑不了Java、中文输出乱码、代码逻辑错了但自己死活看不出来。这里统一整理一下排查思路。6.1 环境变量三件套JAVA_HOME、PATH、CLASSPATH到底干嘛的安装JDK时可以勾选“自动配置PATH”但很多人还是习惯手动配置因为以后换JDK版本时改一个JAVA_HOME变量就行不用动PATH。JAVA_HOME指向JDK安装目录比如D:\Java\jdk-21PATH里加上%JAVA_HOME%\bin这样你在命令行敲java或javac系统才会去这个目录找对应的程序。CLASSPATH是告诉JVM去哪找我们自己写的类JDK 1.5之后默认值就是当前目录一般不用手动设置反而设错了容易出莫名其妙的问题。排查的时候步骤很简单命令行输入java -version能显示版本说明环境OK再输入javac -version能显示说明编译环境OK。如果java能用而javac不能用多半是PATH里只有JRE路径没有JDK路径——很多人装JDK时把JRE和JDK弄混了PATH配的是JRE的binjava能找到但javac找不到就是这个原因。6.2 中文乱码编码格式不一致是万恶之源控制台输出中文变成乱码或者中文出现了方块基本可以断定是源文件编码和编译/运行环境的编码不一致。最直接的处理方法是所有环节统一用UTF-8。IDEA里右下角要把文件编码设成UTF-8控制台也要指定UTF-8命令行手动编译时加上-encoding UTF-8参数javac -encoding UTF-8 Demo.java。Windows系统控制台默认用的是GBK你如果不想改设置把源文件存成GBK编码也行但团队协作时强烈建议统一UTF-8不然你这边的中文注释发到别人电脑上全是乱码。还有一个原因是IDEA的Run Configuration里VM options没加-Dfile.encodingUTF-8这会导致运行时的输入输出流编码不对。总之排查思路就是源文件编码、编译器编码、运行时控制台编码三个对齐问题基本消失。6.3 代码“看着没问题”但结果不对三个高频根因代码能运行但结果和预期不符新手的排查思路往往很乱到处乱改一通越改越糟。这里给你三个高频根因照着查效率翻倍。一是整数除法问题前面说过了检查所有除法操作数看看有没有小数被硬生生截断。二是Scanner的nextInt和nextLine混用问题当你在nextInt()之后直接调用nextLine()会发现那一行好像被“跳过”了。原因很多人不知道nextInt只读取了数字把末尾的换行符留在了输入缓冲区里紧接着的nextLine相当于把那个换行符读走了自然没内容。解决办法是nextInt之后额外调用一次scanner.nextLine()把多余换行符吃掉或者干脆全用nextLine再自己做类型转换。三是比较字符串用了而不是equals这个前面说过同一个内容但不同对象、不同地址用比出来就是false。这三个根因覆盖了80%的新手逻辑错误记住了。6.4 一句经验之谈利用好报错信息别急着问人编译报错信息虽然英文看着烦但仔细看能告诉你很多东西。cannot find symbol说的是找不到某个符号多半是变量名拼错或者作用域不对incompatible types说的是类型不匹配把int往double里塞可能没问题把String往int里塞就报这个array index out of bounds是数组越界你访问了不存在的下标。老老实实把报错的第一行读完往往解决方案就藏在里面。我在带新人的时候反复强调一句话报错不是洪水猛兽是程序在告诉你它在哪一步摔倒了。你学会自己读报错、自己定位问题、自己动手修这比多背十个知识点重要得多因为后者考试才会考前者你上班天天要面对。7. 通往第三天从语法到面向对象的关键过渡第二天的内容到这里你已经把Java语言的“骨架”搭好了能存数据变量、能算逻辑运算符、能分支决策if/switch、能重复劳动循环还能用一个综合小项目把这些知识串起来。接下来第三步就是往骨架上添“血肉”了。第三天开始正式进入核心中的核心面向对象编程。你会学到类与对象、封装继承多态、构造方法、this关键字、static关键字。学完这些你之前学的语法会被系统性重组你会发现自己能设计更复杂的程序了。这个阶段是Java和C语言那些面向过程语言彻底分道扬镳的地方也是Java面试题里占比最高的一块热词里“面向对象编程java”“java八股文”都在指向这个知识点。另外两个第二天可以提前预热的方向一个是字符串操作String是Java里最常用的类它的不可变特性和StringBuilder的区别是面试八股里的常客另一个是集合框架和容器List、Map、Set这些“高级数组”能极大解放你的生产力但前提是你要理解数组和它们的关系。这两个方向现在不用深学但心里可以有个底。我给零基础新人的经验是第三天的学习节奏要比第二天更慢一些面向对象的内容理解门槛高别图快。每学一个新概念就停下来问自己三个问题它解决什么问题不用它行不行它和以前学的哪个概念有联系想明白了再往下走。还有一个老生常谈但不得不说的建议每天保持至少二十分钟纯粹的手写代码时间这是底线。可以不写项目哪怕就是给一个数组排序、打印一个九九乘法表都算数。编程是一门手艺活手艺靠的是日复一日的上手不是囤积了一堆教学视频就以为自己会了。Java这条路很长但第二天的你已经比昨天的自己更接近目的地了。这个进度很好保持住。
返回列表