我这些年带过不少零基础转行的人,也带过一些刚出校门的实习生,发现一个规律:真正把Java学下去的人,第一天做的事情都很像,而半途而废的人,第一天做的事情也都很像——区别往往不在于天赋,而在于第一天信息量太大、方向太乱,人就被劝退了。
所以这篇“JAVA Day01”我打算换个讲法,不罗列一堆需要背诵的语法条文,而是按照一个有经验的人真实的学习路径来梳理:第一天搞清楚Java到底怎么运行的、把开发环境装好并验证通过、亲手编译运行第一个程序、理解变量和数据类型是怎么回事。核心目标只有一个——让你的电脑真正具备“写Java”的能力,并且你亲眼看到自己的代码跑出了结果。至于能不能记住全部细节,不重要,后面每天都会反复用到。这篇文章就是给零基础新手准备的第一课,也是你之后每一天学习的地基。
1. 第一天先搞清楚这件事:Java为什么能“到处跑”
很多教程上来就让你装JDK、配环境变量,但完全没解释这些词是什么意思。结果就是:你照着教程敲了几行命令,环境确实装好了,可一旦遇到报错,你连错误在说什么都看不懂,只能复制粘贴去问别人。这是第一天最容易埋下的隐患。所以我建议,装环境之前,先花二十分钟理解Java这套运行机制。
1.1 JDK、JRE、JVM,这三个名词必须分清
Java的世界里,有三个长得非常像的缩写:JVM、JRE、JDK。第一天不用背定义,但需要在脑子里有一张清晰的分层图。
最底层的叫JVM(Java Virtual Machine,Java虚拟机),它负责真正执行Java程序。你可以把JVM想象成一个“翻译官加执行者”:Java代码被编译之后,生成的不是你电脑CPU直接认识的机器码,而是一种中间形态的字节码。字节码不能直接在Windows或Linux上运行,必须先交给JVM。JVM读取字节码,再把它翻译成当前操作系统和CPU能理解的机器指令,然后执行。所以同一个字节码文件,在Windows的JVM上能跑,在Linux的JVM上也能跑,因为JVM本身是分平台的,而字节码是跨平台的。
中间层叫JRE(Java Runtime Environment,Java运行环境),它的组成是“JVM + Java自带的核心类库”。这就好比一个餐厅,JVM是厨师本人,而RTE还包含了厨房里常用的锅碗瓢盆和基础食材。如果你只是想把一个已经写好的Java程序跑起来,不需要自己开发代码,那么装JRE就够了。但问题是,现实中做开发的人基本不会只装JRE,因为你要写代码、要编译代码,光能跑不够。
最上面一层叫JDK(Java Development Kit,Java开发工具包),它的组成是“JRE + 开发工具”。开发工具里最常用的有两个:javac(Java编译器,负责把源代码编译成字节码)和java(负责启动JVM运行字节码)。如果说JRE是让程序能跑的环境,JDK就是你用来写程序、造程序的全套工具箱。
这里就有无数新人踩过的第一个坑:下载的时候只顾着看版本号,分不清自己应该下JDK还是JRE。不用想太多——做Java开发,直接装JDK,因为JDK里面已经内置了JRE和JVM。装完JDK,运行和开发的能力都有了。
1.2 “一次编写、到处运行”背后的真实代价
Java最经典的口号是“一次编写、到处运行”(Write Once, Run Anywhere)。这个口号确实不是吹牛,而且你的第一天最好就建立起这个心智模型,因为后面你学的一切语法,本质上都在为这个目标服务。
为什么Java能做到?关键在于编译这件事被拆成了两步,而很多语言只有一步。比如C语言,源代码被编译后,直接变成针对某个具体操作系统和CPU的机器码,你在Windows上编译得到的程序,拿到Linux上大概率没法直接运行,因为机器码不一样。Java不一样,javac先把.java源码编译成.class字节码文件,这一步不针对任何具体操作系统,只针对JVM。也就是说,字节码文件是平台无关的,Windows、Linux、macOS只要装了对应版本的JVM,都能运行同一个.class文件。
但是,有得必有失。世界上没有免费的午餐,跨平台的代价是:每一次运行都需要JVM这一层做翻译。翻译自然比直接读母语要慢一些,早期Java被人诟病“性能不行”,根本原因就在这儿。后来Java引入了JIT即时编译技术,JVM检测到某段代码被反复执行时,会把它编译成本机机器码并缓存起来,下回直接执行机器码,速度就提上去了。这个机制你第一天不用细究,只需要知道:JVM并不是每次都傻傻地逐行翻译,它有自己的优化策略。
第一天理解了这套分层逻辑,再去看后面安装JDK、配置环境变量的操作,你就能明白每一步是在干什么,而不是机械地执行命令。
2. 搭建Java开发环境:从下载JDK到命令行验证
理论部分点到为止,接下来是动手环节。很多教程到这个步骤就只是一句“下载JDK并配置环境变量”,但这背后其实有几个决定成败的细节,提前说清楚能省你半天折腾。
2.1 版本选择:LTS才是适合新手的正确答案
这一步我要多说两句,因为版本选错是第一天最常见的返工原因。Java的版本发布节奏经历过一次重大变化:以前是每隔两三年发布一个大版本,后来改成每半年发布一个新版本。版本号跳动变得非常频繁,于是出现了LTS(Long Term Support,长期支持版)和“非LTS版本”的区分。
LTS版本可以得到官方长期的更新和维护,适合生产环境使用;非LTS版本虽然功能新,但支持周期短,更新节奏快,普通开发者没必要追新。对于零基础第一天开始学的人,选版本的原则只有一个:选LTS,不选最新。
具体到2025年的今天,比较主流的LTS版本是JDK 17,而JDK 21也已经发布并成为LTS,新一代项目不少已经在用。如果完全没有历史包袱,我的个人建议是直接上JDK 21,它既是LTS,又比17多了一些方便的语法特性,比如虚拟线程等,不过那些你后面才会接触到。需要说明的是,网上很多老教程还在用JDK 8,那是因为大量存量老项目确实跑在8上。作为新学习者,没有必要从一个旧版本开始,一步到位选个较新的LTS版本,学到的知识更能应对三五年后的主流环境。
2.2 安装JDK与配置环境变量:为什么系统需要知道JDK在哪
选好版本之后,就是安装。不同操作系统安装方式不同:Windows通常是下载一个.exe,一路点“下一步”;macOS一般下载.dmg或使用Homebrew安装;Linux则多用包管理器。安装过程本身不复杂,但有几个细节要记住:
第一,安装路径尽量不要带中文和空格。虽然现代JDK在大部分情况下能容忍带空格的路径,但后续一些命令行工具在某些场景下会因为路径解析出问题,给自己减少麻烦,路径统一用英文,比如C:\dev\jdk-21或/usr/local/jdk-21。
第二,理解环境变量为什么要配。装好JDK之后,系统并不知道你把它装到哪里了。当你在命令行里输入java这个命令时,系统会在一堆默认目录里寻找这个名字的可执行程序,找不到就报“not recognized”之类的错误。环境变量PATH的作用,就是告诉系统:去这些列表目录里找命令。所以你需要把JDK安装目录下的bin目录加进PATH,这个bin目录里放着java.exe、javac.exe等所有开发工具。
第三,还有一个更上层的变量叫JAVA_HOME。这个变量本身不是操作系统必需的,但很多Java工具链(比如Maven、Tomcat、一些编辑器)默认会去读JAVA_HOME来定位你用的是哪个JDK。所以最好在配置系统环境变量时一并把JAVA_HOME设置成JDK安装的根目录。
以Windows为例,常规配置流程是这样的:
- 新建系统变量
JAVA_HOME,变量值为你JDK安装的根目录,例如C:\dev\jdk-21。 - 在
PATH变量(系统变量中的那个,注意不要动用户变量里已有的项)中新增一条%JAVA_HOME%\bin。 - 保存后重新打开一个命令行窗口,让新配置生效。
macOS如果用Homebrew安装,通常OpenJDK会自动做好符号链接,多数情况下不需要手动配置JAVA_HOME,但如果你需要指定某个版本,可以使用/usr/libexec/java_home工具来查路径,再手动导出到shell配置文件里。
2.3 用命令行验证环境:这一步检验你有没有真正装对
环境变量配置完之后,必须做一次验证,别急着写代码。打开新的命令行窗口,依次执行以下三个命令:
java -version javac -version where java第一个命令检查JVM是否可用、版本号对不对;第二个命令检查编译器是否可用,这一步尤其重要,因为有些环境跑Java没问题,却编译不了;第三个命令(Windows),用来确认你当前调用的java命令到底来自哪个安装路径。
如果你配置过多个JDK版本,第三步就特别关键,它会暴露一个经典问题:你明明装好了JDK 21,可是java -version显示的却是另一个老版本。这通常是因为PATH里既有老JDK的bin目录,又有新JDK的bin目录,而系统按照顺序优先找到了前面那个。解决办法是把新JDK的bin目录在PATH里的位置,挪到老JDK之前,或者清理掉已经不需要的旧版本卸载遗留条目。
我把每次给新人排查环境时最常遇到的几类问题和对应的排查方向整理成了一个表格,遇到类似情况可以直接对照。
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
java命令提示“无法识别/不是内部或外部命令” | PATH没配好或没重新打开命令行 | 检查JAVA_HOME与PATH值,重新打开终端 |
java -version有输出,但javac提示无法识别 | 只装了JRE,或者PATH漏了bin目录 | 确认安装的是JDK版本,检查路径是否含bin |
| 显示版本号和刚安装的对不上 | 系统里存在多个JDK,PATH顺序不对 | 用where java定位实际调用的路径,调整顺序 |
| 编译时报编码错误 | 源码文件编码与javac默认编码不一致 | 将源码保存为UTF-8,或使用-encoding UTF-8参数编译 |
环境验证通过,意味着你的机器真正具备了Java开发能力。接下来就可以写第一个程序了。
3. 第一个Java程序:从记事本到命令行,逐行拆解Hello World
第一次写Java程序,我建议不要急着打开什么花哨的工具,就用最简单的文本编辑器(Windows上甚至可以就用记事本)加上命令行完成,把从“源代码”到“运行结果”的整条通路亲手走一遍。这么做不是为了折磨自己,而是让你对Java程序的编译和运行有一个无法被替代的直观感受,也为将来理解各种IDE帮你在后台做了什么铺垫。
3.1 用纯文本写一个源文件,再用javac编译
新建一个文本文件,文件名就叫HelloWorld.java(注意大小写、注意扩展名)。Windows用户要先把系统的“隐藏已知文件类型的扩展名”选项关掉,否则你往往存出的是一个HelloWorld.java.txt,然后再奇怪的报错。文件内容写这几行:
public class HelloWorld { public static void main(String[] args) { System.out.println("你好,Java"); } }写完后保存,然后在命令行里切换到文件所在目录,执行编译命令:
javac HelloWorld.java如果没有任何输出,恭喜,这是好事——编译通过。此时你在目录下会看到一个新建的文件HelloWorld.class,这就是前面讲过的字节码文件。这个文件里的内容既不是给人看的也不直接是机器码,而是给JVM“读”的中间形态。
然后执行运行命令:
java HelloWorld注意,java命令后面跟的是类名而不是文件名,所以这里不需要带.class后缀。如果一切正常,你会看到命令行输出了“你好,Java”几个字。这时候你已经完成了从写代码到编译再到运行的全过程,这短短几行命令里包含的原理,比将来用鼠标点一下“运行”按钮深刻得多。
3.2 HelloWorld代码逐行详解:每行代码都不是多余的
接下来把这五行代码拆开看,这是第一天最重要的学习内容。第一行public class HelloWorld,以及紧跟它的大括号,定义了一个类。Java规定,源代码里所有的代码都必须待在类的内部。类名HelloWorld必须和文件名保持一致,大小写也得一致——这是Java编译器的硬性要求,将来你用IDE时IDE会帮你检查,但现在你手动编译,要特别留心这一点。
第二行public static void main(String[] args),这是main方法,也叫程序的入口。你可以把Java程序想象成一本书,JVM启动时并不知道该从哪一页开始读,它有一个约定:去找那个“入口页”,也就是名为main的方法。public表示这个方法访问权限是公开的,让JVM能调用它;static表示这个方法是静态的,不需要先创建对象就能被调用(对象的概念第一天不用深究,先知道这个固定写法就行);void表示这个方法不返回任何值;括号里的String[] args表示这个方法接收一个字符串数组作为参数,这是为了在某些情况下向程序传入命令行参数。很多新手会疑惑:为什么这串东西一个都不能少?因为这是JVM启动程序的约定,就像插座的三孔标准一样,你少一个孔,插头就插不进去。
第三行System.out.println("你好,Java");就是实际的执行内容。System是Java自带的一个系统类,out是其中的输出对象,println表示打印一行并换行。整体意思就是:调用系统标准输出,把括号里的内容打印到命令行。行尾的分号千万不能漏,Java规定每一条语句结束必须有分号,漏了就报编译错误。
3.3 编译和运行的区别:别再混淆javac和java
新手第一天最常见的困惑,就是javac和java这两个命令到底有什么区别。我换一个生活化的类比:javac就像是一个加工厂,把原材料(.java源代码)加工成半成品(.class字节码),加工过程会对质量做一遍严格检查——所以编译期的错误,本质上就是工厂发现你的材料有问题,比如写错了单词、少了分号、括号没配对。而java命令则是把半成品送到终端(JVM)去展示销售,这个阶段才会暴露运行时问题,比如你让程序访问了一个不存在的东西,那就是运行到了那一行才报错。
这个区分很重要,因为新人经常搞混这两类报错。编译错误会指出具体的行号和错误原因,通常容易修复;运行时错误则往往需要你回到代码逻辑里去找问题根源。学会看报错信息,是Java学习第二天就要养成的习惯:先看错误发生在哪一行、什么类型、信息提示了什么,再去上网搜索,而不要遇到任何报错都把整段信息丢给别人帮你看着。你越早学会读懂报错,学得就越快。
4. 变量与基本数据类型:编程的“储物格”模型
第一个程序跑通之后,第二件事就是理解变量和数据类型。其实变量这个概念,只要你上过小学数学都能理解——它就是装东西的容器。但编程里的容器有更严格的规定:一个容器只能装特定类型的东西,而且不同容器的容量和特性不一样。
4.1 变量到底是什么:内存、名字和值
变量在计算机世界里,本质是一块内存区域的名字。你可以把内存想象成一栋巨大的储物楼,每个房间有一个地址。直接记地址很不方便,所以你给房间贴了个标签,比如“age”,之后你只需要说“age,里面放的是25”,计算机就会在背后找到对应的房间并写入值。
定义一个基本变量的语法是:数据类型 变量名 = 值;。例如:
int age = 25; double price = 9.9; boolean isStudent = true; char grade = 'A';请一定注意细节问题:整数字面量直接写,小数字面量直接写,布尔值只有true和false两种,字符要用单引号括起来且只能有一个字符。这些规则第一天记不住没关系,但每次写代码时要刻意去对照。
变量又是可以重新赋值的。第一天最值得做的一个小实验,就是写一段代码把变量先赋值再改值再打印,亲眼看它变化。比如:
int count = 1; System.out.println(count); count = 2; System.out.println(count);这个实验看起来平平无奇,但它会帮你直观建立“变量是容器,容器里的内容可以变化”的心智模型。很多人后面学循环访问数组的时候晕,往往就是当时没有真正理解变量本身的含义。
4.2 八种基本类型最多记四种,String单独记
Java的八大基本数据类型,第一天真的不用全部背下来。我建议优先记住并且实际使用这四种:int(整数,日常最常用)、double(小数,日常最常用)、boolean(布尔值true/false)、char(单个字符)。另外四种byte、short、long、float,知道存在即可,后面用到再回来查。为了方便你有个整体把握,我列一个对照表,后面学习中想不起来可以回来看。
| 类型 | 用途 | 默认值 | 典型示例 |
|---|---|---|---|
int | 整数 | 0 | int age = 25; |
double | 双精度小数 | 0.0 | double price = 9.9; |
boolean | 布尔值 | false | boolean ok = true; |
char | 单个字符 | '\u0000' | char grade = 'A'; |
long | 大范围整数 | 0L | long id = 12345678901L; |
float | 单精度小数 | 0.0f | float f = 1.5f; |
byte | 极小整数 | 0 | 一般用于文件流相关场景 |
short | 较小整数 | 0 | 一般用于底层数据场景 |
String尤其值得单独说。很多零基础学员容易把String当成基本类型,因为它用起来也很简单:String name = "张三";,但要明白,String是一个类,它只是长得像基本类型。为什么要注意这个区别?因为字符串的很多用法(比如比较内容、拼接、截取)都涉及对象的方法调用,和基本类型的行为不完全一样。第一天使用字符串,把拼接学明白就够了,代码示例:
String firstName = "张"; String lastName = "三"; String fullName = firstName + lastName; System.out.println("我的名字是:" + fullName);Java里的+,当两边至少有一个字符串时,它的作用是拼接。这个知识点在第六天写日志、输出调试信息时会反复用到,第一天就接触,将来不陌生。
4.3 命名规范与典型报错:避免低级返工
命名规则第一天必须重视,因为它在后续每一天的代码里都会出现,而且一旦养成坏习惯,后面堆出来的代码自己都看不懂。Java的命名规范并不复杂:
- 类名使用大驼峰命名法:每个单词首字母大写,如
HelloWorld、StudentInfo。 - 变量名和方法名使用小驼峰命名法:首个单词首字母小写,后面单词首字母大写,如
userName、getAge。 - 变量名只能包含字母、数字、下划线
_、美元符号$,且不能以数字开头。 - 不能使用Java保留关键字(如
class、public、void等)作为变量名。
第一天的报错大概率出现在几个地方:分号缺失、大括号不匹配、字符串引导写成了中文引号。这里我特别想提醒中文输入法问题:写代码时经常会在不知不觉中把引号或分号输成全角形式(中文标点),javac会立刻报错,而且某些编辑器中全角标点和半角标点长得区别不大,新手容易盯着代码看半天也找不出问题。我的建议是:写代码时把输入法切到英文模式,尤其注意引号和分号。这是看起来特别小、却让无数新手花费大量时间的隐形杀手。
5. 第一次保存并运行代码的常见翻车现场
这一章我想集中聊一聊我观察到的、第一天学Java最容易翻车的几个场景。这些坑不是理论上的“可能发生”,而是我见过太多次的真实情况,提前预警能帮你省下大量时间。
5.1 文件保存编码问题:中文乱码的真相
很多新同学第一次运行HelloWorld,程序明明能跑,但输出的中文变成了乱码。这个问题几乎可以确定与编码有关。javac编译源码时,对源码文件的读取默认编码取决于操作系统的区域设置。在Windows中文环境下,默认可能是ANSI或GBK,而现代编辑器默认保存为UTF-8。两者不一致,就会导致编译时读出来的中文已经损坏,最终输出的自然就是乱码。
最简单的解决办法是:如果你使用命令行方式编译,并且源码保存为UTF-8格式,那么编译时明确告诉javac用UTF-8读取,命令如下:
javac -encoding UTF-8 HelloWorld.java如果你用的是IDE(Integrated Development Environment,集成开发环境),则只需要在设置里统一项目的文件编码为UTF-8。这一课,第一天学到“UTF-8”这个词,就算赚到了,后续你会在无数配置文件中看到它。处理乱码问题的通用排查顺序是:确认源码文件保存编码、确认编译时读取编码、确认命令行显示编码,三者对齐就好。
5.2 类名与文件名不一致、命令行目录没切换对
“找不到或无法加载主类”可能是第一天仅次于乱码的高频报错。我给你还原一个真实场景:你在某个目录里创建了HelloWorld.java,然后在命令行里输入java HelloWorld,结果报错“找不到或无法加载主类”。很多新人第一反应是修改代码,但实际上这时候应该做的是检查:当前命令行所在的目录,是不是真的有你编译出来的.class文件?如果目录不对,系统当然找不到类。你想想看,就好比你在一楼的鞋柜里找放在二楼衣柜里的衣服,找不到不是衣服消失了,是你走错了地方。
另一个常见原因是,你修改了文件内容后忘了重新编译,直接运行。Java不会自动重新编译源代码,除非你用IDE。手动命令行操作时,每次修改完.java文件,都要重新执行javac,否则JVM加载的还是旧编译产物。这个坑第一天踩过之后,你就知道什么叫“改完代码一定要先编译再运行”。
至于“类名和文件名不一致”报错,解决方案很直白:把文件名改成类名保持一致,或改类名保持一致。顺便说一句,约定俗成的做法是:每个.java文件里只写一个public class,并且类名与文件名一致,这是Java工程结构的核心约定之一。
5.3 第一天最值得收藏的调试口令
最后给出几个第一天就要记牢的调试口令,作为你的“急救包”。以后无论在命令行还是在IDE控制台,只要你写的Java程序出了问题,都可以按下述顺序做基础判断:
javac -encoding UTF-8 你的文件.java java 你的类名如果编译报错,先看第一行报错信息里的行号,回到对应代码行检查。如果运行报错,注意异常类型的名字,比如ArrayIndexOutOfBoundsException是数组越界、NullPointerException是空指针,这些异常你以后会经常打交道。搜索引擎使用技巧也很重要:直接复制报错信息的核心英文部分去搜索,不要搜索主观描述“Java为什么跑不起来”这种,搜到的结果会精准得多。
注意:命令行窗口如果提示“不是内部或外部命令”,先重新打开一个新的命令行窗口,多半是环境变量改了之后当前窗口还在用旧配置。
6. 第一天别碰这些内容,别让好奇心拖垮节奏
一个扎实的第一天,除了知道自己该学什么,还要明确知道自己不应该学什么。很多新同学刚接触Java时精力很旺盛,这本来是好事,但在没有地基的情况下追求大而全,反而容易造成认知负荷过载,第二天就提不起兴趣。
6.1 IDE暂时可以先不装,先感受命令行
市面上有很多优秀的Java集成开发环境,比如IDEA和Eclipse,功能强大到可以一键编译、一键运行,写代码时还有自动补全。对于老手来说,它们简直是生产线上的机械臂,效率极高。但对于第一天的人来说,机械臂会掩盖掉你本该看到的那些“手工工艺细节”。
第一个程序建议用文件编辑加命令行来写和跑,哪怕慢一点,哪怕多报几次错,这些曲折本身都是珍贵的理解。等你亲手跑通了第一个程序,对编译和运行有了基础概念之后,再从第二天开始引入IDE,那时候IDE帮你做的事情你都能理解,用起来就不仅仅是“点按钮”了。如果你已经在用IDE且能跑通代码,也没有必要倒退回去用记事本,重要的是理解原理而不是刻意折磨自己。
6.2 对象、数组、循环,第一天一个字都不用深入
和很多人想的不一样,Java课程通常把面向对象作为核心,但在第一天,你看到public class这样的写法,只需要把它当成一种“必须这样写”的格式就好。不用急着去追问对象、实例、封装、继承、多态这些概念,它们将在你有了基础语法概念之后再进入你的认知,才不会显得面目可憎。同样地,数组、循环、条件判断、方法定义等,后面每一天都会专门展开,第一天只要有印象即可。
这里我唯一的建议是:第一天结束前,给自己留一个“能力检查清单”,不必逐条背诵,但要有意识地自查。我提供一个自己总结了多年的清单版本,也一直在给新同事使用。
| 检查项目 | 达标标准 |
|---|---|
| Java运行机制认知 | 能用自己的话说明JDK、JRE、JVM的关系 |
| 环境搭建 | 命令行下java -version与javac -version均正常 |
| 手动编译运行 | 能用javac编译,用java运行一个简单程序 |
| 代码基本结构 | 能准确说出main方法在代码里的作用 |
| 变量基础 | 能写出int、double、boolean、String四类变量 |
| 命名规范 | 知道类名大驼峰、变量名小驼峰 |
| 常见报错处理 | 遇到“乱码”“找不到类”时知道排查顺序 |
6.3 记录你自己的问题和报错
还有一件特别重要但特别容易被忽略的事:从第一天起,把自己遇到的问题和报错记录下来。不需要写多华丽的笔记,只要记录三样东西:你干了什么、报了什么错、最后怎么解决的。这个“个人踩坑日志”看似简单,却是你语言学习路上最强大的加速器。
我见过太多学员明明踩过某个坑,第二次遇到却还要从头查一遍。而坚持记报错日志的人,三天之后就会开始形成自己的知识库,别人来问他问题他甚至能说得头头是道。这个过程不是浪费时间,而是把别人的经验和你自己的经验沉淀为长期记忆。第一天正式接触Java,能有意识地养成“遇到报错先读、再查、再记”的习惯,我认为比多学几个语法点更值钱。
写代码是一条渐入佳境的曲线,第一天可能感觉全是新东西,好像每个角落都是陌生的,但只要环境通了、程序能跑、变量会用、报错会看,你就已经稳稳地站在了这条曲线的起点上。后面的事情,明天开始一天一天往前推进就行。