☰
Java第十天学习指南:从语法到面向对象与集合实战
2026/10/8 10:40:10 网站建设 项目流程

学完基础语法之后的那几天,往往是最容易让人产生“我好像会了,但真动手又不知道写什么”的感觉的阶段。如果你正处在Java学习的第十天左右,这个节点其实非常关键:你不再需要死磕变量、if、for这些零散语法,而是要把“能看懂代码”升级成“能设计代码”。这篇文章就围绕第十天这个节点展开,聊聊面向对象思维怎么落地、集合框架怎么选、异常处理怎么用,以及怎么通过一个完整小项目把前几天的知识串起来。既有代码示例,也有我实际踩过的坑,希望对正在这个阶段的人有点帮助。

1. 第十天的学习定位:从语法认知到代码设计

1.1 为什么第十天是一个分水岭

多数Java学习路线会把前十天安排为:环境搭建、基础语法、流程控制、数组与字符串、方法、面向对象入门、集合框架初步、异常处理、常用API、综合练习。到第十天,你至少应该能独立写出“一个类、两个对象、三个方法”这样的小程序,并且能解释清楚“类跟对象到底什么关系”。如果这些还没做到,不用慌,第十天正好用来补齐缺口;如果做到了,那今天就可以尝试跳出练习题,做一个带交互逻辑的小系统。

我自己带过几个转行学Java的朋友,发现一个规律:前面几天靠看视频、抄代码都能跟上,到第十天开始分化——有人开始觉得“原来Java不过如此”,有人开始觉得“怎么越来越难了”。差别不在智商,而是有没有把“调用别人写好的功能”转变成“设计自己的类结构”。这就像学做饭,前面几天是学会切菜、开火、放油,第十天是你第一次不看菜谱,自己搭配一道菜。搭配得不好吃很正常,但这个过程必须经历。

1.2 第十天应该具备的三种能力

到了这个阶段,我建议你对照一下自己有没有具备下面三种能力,这比记住某个API重要得多:

  • 拆解能力:拿到一个需求,能把它拆成几个独立的小功能,而不是一股脑写进main方法。
  • 抽象能力:能从“书、学生、订单”这类具体事物里提炼出共同属性(比如书名、编号、借阅状态),然后设计成类。
  • 排错能力:控制台报错不再只看第一行红色字母,而是会顺着堆栈信息找自己写的那个类、那一行。

这三种能力是后面学Spring、学MyBatis的底层支撑。顺便说一句,第八天、第九天我经常建议大家把数据类型、运算符、流程控制再巩固一遍,因为真正写项目时,最容易出错的反而是“整数除法会截断”“字符串比较要用equals”这类基础细节。第十天不是往前猛冲的日子,而是回头把地基踩实的一天。

2. 面向对象进阶:先把类设计明白再谈其他

2.1 类设计的基本套路

第十天练习的核心载体就是“类”。我见过很多初学者写类的时候,喜欢把所有字段堆在一起,所有方法堆在一起,能跑就行。但代码一旦超过100行,这种写法就失控了。一个实用的参考套路是:字段私有、提供构造器、统一通过方法访问。

下面这个例子是一个简单的“学生”类,我特意按第十天能理解的程度写的:

public class Student { private String id; private String name; private int score; public Student(String id, String name, int score) { this.id = id; this.name = name; this.score = score; } public String getId() { return id; } public String getName() { return name; } public int getScore() { return score; } public void setScore(int score) { if (score >= 0 && score <= 100) { this.score = score; } else { System.out.println("分数不合法,本次修改无效"); } } public void showInfo() { System.out.println("学号:" + id + ",姓名:" + name + ",成绩:" + score); } }

为什么字段要私有(private)?因为直接暴露给外部,别人就可能把score改成负值、把name改成null,对象就处于一种“不合法的状态”。通过setter方法加一道检查,等于给数据上了道保险。这个道理和银行卡不放现金、取钱走柜台校验是一个意思。现阶段你不需要理解得太深,但一定要养成这个习惯。

2.2 封装、继承、多态到底在解决什么问题

这三个概念是面向对象的基石,第十天如果只听懂了名词,后面会越来越累。我用大白话翻译一下:

  • 封装:把数据和操作数据的方法包在一起,对外只留必要入口。就像遥控器,内部电路很复杂,但面向用户的只有几个按钮。
  • 继承:抽取多个类的共同代码,放到一个父类里。子类通过extends复用父类代码,解决的是“重复代码太多”的问题。
  • 多态:父类类型的变量指向子类对象,调用同一个方法时,表现的却是子类的行为。解决的是“代码写得更通用”的问题。

举个实际例子:假设你要做一个“车辆管理系统”,有Car和Truck两种车,它们都有品牌和速度,但卡车额外有载重量。如果你不设计父类,就得写两个几乎重复的类;如果你设计了Vehicle父类,那么Car和Truck各自继承,再各自扩展自己的属性,主程序统一用Vehicle类型操作所有车辆。后面如果要加摩托车,只需要新增一个类,原有代码一行都不用改。这就是多态带来的维护价值。

这里有一个第十天常犯的错:为了用继承而继承。如果两个类之间没有明显的“is-a”关系(比如狗是动物、老师是人),就别硬造父类。强行继承只会让代码关系混乱,后面改起来非常痛苦。

3. 集合框架:为什么数组不够用,以及怎么选

3.1 数组的局限与集合的登场

学数组的时候,你应该已经写过这样的代码:

String[] names = new String[10];

数组的固定长度意味着:你创建了10个格子,就永远只能放10个元素,放第11个就会越界。但现实需求往往是“不确定有多少本书、多少个用户、多少条订单”。这时候集合就派上用场了。

Java集合框架里,第十天最常用的三个接口是:List、Set、Map。它们的核心区别可以浓缩成三句话:

  • List:有序,可重复,像排队买东西,每个人都有自己的位置。
  • Set:无序(大部分实现下),不可重复,像身份证号集合,不会有两个一样的。
  • Map:键值对,像查字典,通过一个key直接找到value。

我用一个表格帮你对照:

接口是否有序是否允许重复典型实现典型场景
List有序允许ArrayList、LinkedList学生名单、日志列表
Set大部分无序不允许HashSet、TreeSet去重后的用户名集合
Map键无序key不允许重复HashMap、TreeMap学号对应学生对象

3.2 ArrayList和LinkedList怎么选

这是面试里几乎必问的问题,第十天提前搞明白,后面能省很多事。简单说:

  • ArrayList底层是数组,读取靠下标,所以“按索引查找”非常快,但中间插入、删除元素时要移动后面的所有元素,所以偏慢。
  • LinkedList底层是双向链表,每个节点保存前一个和后一个节点的引用,所以头尾插入、删除非常快,但按索引取第n个元素需要从头遍历,偏慢。

实际开发里,90%的场景用ArrayList就够了,因为绝大多数需求是“遍历、读取、追加”。LinkedList更多用在“频繁在头部插入删除”这种特殊场景,比如实现队列、栈。我见过有初学者为了炫耀自己会用LinkedList,把明明该用ArrayList的地方换成LinkedList,结果数据量一大反而慢得离谱。工具选型跟找对象一个道理,合适比高端重要。

3.3 冒泡排序的写法与易错点

排序是热搜词里出现频率很高的内容,冒泡排序作为最基础的排序算法,第十天一定要能手写出代码。它的大体思路是相邻两个元素两两比较,如果顺序不对就交换,每一轮能把一个最大(或最小)的元素“冒”到末端。

public static void bubbleSort(int[] arr) { int n = arr.length; for (int i = 0; i < n - 1; i++) { boolean swapped = false; for (int j = 0; j < n - 1 - i; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; swapped = true; } } if (!swapped) { break; } } }

这段代码里容易踩三个坑:第一个,内层循环的边界是n - 1 - i,很多人会漏掉-i,导致每一轮都比到最后一个元素,虽然结果不错,但多了许多无意义比较;第二个,交换三个步骤的顺序绝对不能乱,必须先用临时变量存下arr[j],再赋值;第三个,如果加了一个swapped标记,某一轮没有任何交换,说明数组已经有序,直接break退出,这份优化代码在面试里很加分。

实际操作中,你写完排序后可以用一组乱序数据测试,比如{5, 3, 8, 1, 9},手动在纸上先演算一遍,再看程序输出对不对。这个过程能帮你建立“程序结果可以预判”的感觉,而不是每次都盲目运行看结果。

4. 异常处理与调试:让程序在出错时保持体面

4.1 为什么不能靠报错信息猜问题

第十天以前,初学者最常见的排错方式是:报错了,删掉报错那段代码,重新写。这能解决简单问题,但遇到NullPointerException、ClassCastException这类运行时异常时,光靠“删了重写”效率极低。

正确做法是学会看异常堆栈信息。像这样一段报错:

Exception in thread "main" java.lang.NullPointerException at com.example.demo.Main.main(Main.java:12)

关键信息有两块:异常类型是NullPointerException,出错位置是Main.java的第12行。你应该立刻去看第12行,找出那里哪个对象可能是null。永远不要只看第一行就抓狂,要顺着“at”后面的信息往下找自己写的类。

4.2 异常处理的核心语法与取舍

第十天你需要掌握的就是try-catch-finally,以及知道什么时候该捕获、什么时候该抛出。一个最基础的写法是这样:

public static void main(String[] args) { try { int result = divide(10, 0); System.out.println(result); } catch (ArithmeticException e) { System.out.println("除数不能为0:" + e.getMessage()); } finally { System.out.println("无论是否异常,这行都会执行"); } } public static int divide(int a, int b) { return a / b; }

但我想提醒你的是:异常处理不是越多越好。初学者很容易每个方法都写try-catch,结果把代码裹得像个洋葱,真正调用方想知道错误原因都找不到。一个比较合理的参考原则是:

  • 底层方法一般抛出异常,不处理,让上层决定怎么响应用户。
  • 上层方法(比如main、界面层、接口入口)负责捕获并处理,给用户一个友好的提示。
  • finally块适合释放资源,比如关闭Scanner、关闭数据库连接(后面学JDBC会用到)。

我自己在实际调程序时,还有一个终极技巧:在项目里临时加上“打印日志”,一步步跟踪变量的值。比如怀疑某个字段没赋值,就在方法里打印一次;怀疑循环次数不对,就打印i的值。等确认没问题后,再把打印语句删掉。很多初学者不知道,调试器(IDEA里Debug模式)才是排查问题的利器,断点一打,逐行查看每步的变量变化,比盲人摸象强太多。如果还没用过Debug,第十天一定要花一个小时学会它,这个投入极其划算。

5. 实操项目:用十天所学做一个命令行图书管理器

5.1 需求拆解与类结构设计

前几节的内容比较分散,现在把它们合起来做一个完整的小项目。这个项目是我一直推荐给第十天学习者的练手案例:命令行图书管理器。需求简单但五脏俱全——需要设计类、用到集合、处理用户输入、面对各种异常。

需求拆解如下:

  • 能添加一本新书(输入书名、作者、价格)
  • 能根据书名查找书的信息
  • 能显示所有书
  • 能按价格排序
  • 用户输入错误的菜单选项时,程序不应该崩溃

按面向对象思路拆解,我至少需要两个类:

  • Book类:包含书名、作者、价格三个字段,提供构造器和getter/setter,以及展示信息的方法。
  • BookManager类:内部持有一个List用于存书,提供addBook、findBook、showAllBooks、sortBooksByPrice等方法。
  • Main类:负责循环读取用户输入,并调用BookManager的方法。

5.2 核心代码实现

Book类比较简单,重点看BookManager类的核心逻辑:

import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class BookManager { private List<Book> books = new ArrayList<>(); public void addBook(Book book) { books.add(book); System.out.println("添加成功:" + book.getTitle()); } public void findBook(String title) { for (Book book : books) { if (book.getTitle().equals(title)) { System.out.println("找到书籍:" + book.getTitle() + ",作者:" + book.getAuthor() + ",价格:" + book.getPrice()); return; } } System.out.println("没有找到书名包含“" + title + "”的书籍"); } public void showAllBooks() { if (books.isEmpty()) { System.out.println("图书列表为空"); return; } for (Book book : books) { book.showInfo(); } } public void sortBooksByPrice() { Collections.sort(books, new Comparator<Book>() { @Override public int compare(Book b1, Book b2) { return Double.compare(b1.getPrice(), b2.getPrice()); } }); System.out.println("按价格从低到高排序完成"); showAllBooks(); } }

这里的排序用了Collections.sort配合Comparator,这是集合操作中非常常见的写法。Double.compare用于比较两个double值,避免直接用b1.getPrice() - b2.getPrice()时产生精度问题。

Main类的写法我就不赘述了,核心是配合Scanner接收用户输入,用一个while循环加switch分支,处理菜单。这里有一个很重要的小细节:用nextLine()读取用户输入前,如果有过nextInt()调用,必须先消化掉换行符,否则nextLine会直接读到空字符串。具体做法是在读取整数后加一句scanner.nextLine();,或者干脆全部用nextLine读取后做类型转换。这是几乎所有初学者都会踩的坑,包括当年我自己。

5.3 综合调试与验证

写完之后你千万别急着说“完成了”,要按下面几步自测:

  • 正常路径:添加三本书,查看列表,按价格排序,再看列表。
  • 边界路径:一本书都没添加时,直接查看列表,程序不应该崩溃。
  • 异常路径:输入一个不在菜单里的数字,程序应该提示重新输入,而不是报ArrayIndexOutOfBoundsException。

我在写这个项目时曾经验证出一个很有意思的问题:如果不处理Scanner的换行符残留,用户会在输入完菜单后,被程序连续追问两次“请输入书名”。你如果也遇到这种问题,恭喜你踩到了经典坑,用前面说的nextLine清理方法就能解决。项目跑通后,我还建议你再扩展一个需求:把添加的书籍保存到本地文件里,下次启动还能读出来。这就涉及到流操作,恰好是第十一天要学的内容,无缝衔接。

6. 面试题与八股文:第十天提前接触不亏

6.1 值得提前背的几个经典问题

热搜词里反复出现“java面试题”“java八股文”,很多初学者觉得面试离自己还远,其实不然。第十天接触面试题有两个好处:一是通过问题倒逼自己整理知识;二是避免后面学框架时把基础忘了。我筛了三个现阶段最值得看的题,都不难,但都是面试必问:

  • String和StringBuilder的区别是什么:String是不可变的,每次拼接都会生成新对象,循环拼接时性能差;StringBuilder是线程不安全的可变字符序列,频繁修改字符内容优先用它。
  • ==和equals的区别是什么:==比较的是引用地址(基本类型比较值);equals在Object中默认也是比较地址,但String等类重写了equals,比较的是内容。
  • 重载和重写的区别是什么:重载发生在同一个类中,方法名相同、参数列表不同;重写发生在父子类之间,方法签名完全相同,子类重新实现父类方法。

这些问题现在不理解100%,可以先记下来,能说个大概就行。后面每学一章,回头再看这些问题,理解深度会自然加深。我当年就是这个思路,第一次看到StringBuilder时一脸懵,后来在某次聊天时突然想通了——它就是个“可变版本的String”,只此而已。

6.2 蓝桥杯算法题:基础语法怎么转化成题解能力

热搜词里也有“蓝桥杯”“算法题目”相关的内容。如果你打算参加蓝桥杯Java组,第十天正好是可以开始刷简单题的时候。不需要一上来就啃动态规划、图论,而是先从“模拟题”入手,比如:判断闰年、水仙花数、简单字符串处理这类题目。

蓝桥杯的题目风格很统一,喜欢考察“细心”和“基本的边界处理”。举个例子,有一种非常常见的题是“输入一个整数n,输出1到n之间所有能被3整除的数之和”。看起来简单,但有人会在n是负数时忘记处理,有人会用浮点数做整除判断导致误差。把这类题做顺了,你对数据类型、循环、分支的掌握才算是真正过关。

同时,第十天可以开始了解java.util.Arrays和java.util.Collections这两个工具类,尤其关注Arrays.sort()、Arrays.toString()、Collections.reverse()这类常用方法。它们能帮你用更少的代码解决更多问题,在算法比赛里少写几行就是多抢几分钟时间。

7. 环境与工程化:从跑通代码到稳住工程

7.1 多JDK环境配置问题

热搜里有“java环境变量使用多个jdk”“java环境配置”“java启动失败”这几个词,第十天也确实该处理这些事了。很多人的电脑上会同时装着JDK 8、JDK 11甚至JDK 17,因为不同老项目需要不同版本。这时环境变量的配置就很重要。

我的做法是:在环境变量里设置一个JAVA_HOME指向当前需要用的JDK目录,然后修改PATH里的%JAVA_HOME%\bin。需要切版本时,只改JAVA_HOME的值,不用动PATH。命令行执行java -version确认切换生效。这里很容易踩一个坑:windows下如果同时装了Oracle JDK和之前某个安装包自动写入PATH的Java路径,命令行跑的Java可能不是你JAVA_HOME指定的那个。解决方式是检查PATH列表里有没有更靠前的java.exe路径,把多余的全删掉。

还有一个常见的问题是“java启动失败怎么解决”。启动失败的原因五花八门,但我遇到最多的三种是:端口被占用、内存溢出、类路径缺失。端口占用用netstat -ano | findstr "端口号"查到PID,再到任务管理器结束进程;内存溢出一般调整JVM参数,比如IDEA里设置-Xmx;类路径缺失通常是jar没引全,在IDE里rebuild一下就好了。建议第十天就养成“看日志前30行+后30行,中间先跳过”的习惯,效率会高很多。

7.2 打成tar包部署是什么玩法

热搜里有个挺有意思的词:“怎么把java项目打成tar包”。对第十天的初学者来说,这不是核心,但可以提前知道一下。正常情况下,Java项目会打成jar包或war包,然后扔到服务器上运行。打tar包则往往是为了把“jar包+配置文件+启动脚本+日志目录”一起打包,拷到服务器上解压即用。

具体操作其实不复杂:在项目根目录执行jar命令构建出可执行jar包,再用tar -czvf app.tar.gz app/把整个应用目录压缩。服务器那边执行tar -xzvf app.tar.gz解压,然后运行里面的启动脚本。第十天不需要深入,只要理解:本地能跑通不等于服务器能跑通,部署是一个涉及目录、权限、环境变量、日志采集的系统工程。后面学到Spring Boot时,再回头来看这个流程,你会发现一切都顺理成章。

8. 进一步学习路线与实用资源建议

8.1 接下来一周应该学什么

如果你顺利完成了上面的图书管理器项目,第十一天的安排可以很清晰:学习Java的文件读写(IO流),让你的图书数据能在程序重启后依然存在;第十二天学习多线程基础,理解线程和进程的区别;第十三天开始接触网络编程或者直接进入数据库JDBC;第十四天到第十五天,可以尝试给图书管理器加上数据库存储,替换掉内存集合。

这个节奏的核心逻辑是:每天学的新东西,都能往已有的项目里添加。很多人学完一遍Java基础后依然云里雾里,根源在于学的东西都是孤立的,没有跟自己的练手项目挂钩。我建议你不要急着追新技术,先把“增删改查”这件事在控制台里做顺,再去接触Spring Boot,就会轻松很多。

8.2 资源选择的一个原则

现在的Java学习资源极其丰富,视频、文档、在线练习平台满天飞。我的实际建议是:认准一份主资源,从头啃到尾,中间不要频繁切换。经常有人今天看A老师的课,觉得听不懂,明天换B老师的视频从头开始,后天又觉得C老师的项目讲得好,结果半个月过去了,还在讲环境搭建。

学习第十天的你,应该有一套自己能反复查的文档和一本讲原理的书。视频用来入门,文档用来查细节,书用来建立体系。平时刷到的技术文章,可以收藏,但别让它们打乱你的主线节奏。

8.3 最后的经验之谈

从我带新人的经验看,Java学到第十天,最容易出现的心理状态是“焦虑”。焦虑自己进度慢,焦虑别人已经会用Spring Boot了,焦虑面试题看着陌生。所以我特别想对读到这里的人说一句:慢不是问题,乱才是。今天如果你能心平气和地把一个类写明白、把一个集合选对、把一个异常处理清楚,你已经比昨天强了一大截。

我在当年学Java的时候,也是第十天处于“好像懂了很多、又好像什么都没懂”的迷糊状态。真正让我开窍的,不是看了更多视频,而是逼自己写了一个像“图书管理器”这样的小东西。写着写着,一个个零碎的概念就自己连成线了。愿你也能在第十天动手写一个自己的小程序,哪怕丑一点、笨一点,跑起来那一刻的成就感,是任何教程都给不了的。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询