JAVA环境搭建,工具安装,代码的初步尝试与理解(针对完全没有接触过编程的)
第一课的正确打开方式
搭建环境:JAVA是一门计算机语言,任何语言都要建立在具体的环境(语境:比如中英文)。环境是理解你组织的计算机语言的地方。也就是说要想计算机内核理解你并执行你的命令,你就需要搭建不同语言的不同环境,让这个环境来帮你把你的语言翻译为计算机内核能理解并执行的事情。
安装工具:工具是用来组织你代码的利器,试想如果你徒手掰苹果和用水果刀切对比,虽然两者都能同时完成,但是哪个更省事是显而易见的。工具能帮助你完成非常多繁琐而又重复的事情。比如在你的环境和代码都编写完成之后,来帮助你完成基于这个环境翻译给计算机内核的过程(等等还有很多)。此外你可以用txt文本文件来进行开发,但是没有必要。
语法:JAVA语言也需要通过词汇(英语单词、中文字)&语法来合理的组织,才能够令你搭建的环境正确的认识你的内容。好比如中式英文:用中文的语法去组织了英文的内容,所以是不被英国人理解的。PS:建议多记忆多背诵。
开始学习之前的学习方法强调:结合实际,以结果为基础反向推导你要做的事情。从要达成什么效果 到 要干一些什么事情。
环境&工具
环境 JDK(Java Development Kit)
咱们现在可以理解为JDK就是咱们编写JAVA语言的环境。前面咱们提到过JAVA本身也是C语言开发出来的软件,是软件就需要不断地迭代更新修复等,所以有非常多不同的版本。这里咱们选择JDK 1.8,同时这也是当前企业最流行最稳定的版本。下载链接ORALCE官网JAVA8下载地址。
Windows同学
- 选择windows TAB 页下载,下载好后运行该.exe文件。x86就是32位操作系统,x64就是64位操作系统
- 安装选项选择(记住安装目录,一会要用)
- 然后在弹出的界面一直下一步就可以了
- 配置环境变量
4.1. 安装完成后,右击"我的电脑",点击"属性",选择"高级系统设置"(也可以在控制面板中搜索)
4.2. 在弹出的窗口中选择"高级"选项卡,点击"环境变量";
4.3. 总体的界面是这样的:
4.4. 这里有用户变量和系统变量,注意点击系统变量下的新建按钮。在弹出的新建系统变量窗口中,新建 名字为JAVA_HOME的环境变量,变量值为刚提醒你记住的Java安装目录,示例参考:C:\ProgramFiles\Java\jdk1.8.0_181
4.5. 确定后再找到系统变量下的,变量名为Path的变量双击打开编辑系统变量,然后在变量值尾部追加**;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin**,点击确定。(这里先不要着急关闭这些窗口以免后续配置错误需要重来)
4.6然后使用Win+R快捷键输入cmd回车,便可以跳转到windows命令执行界面,并且在命令行输入java -version。届时命令的反馈结果为如图便是成功。
Mac同学
-
选择macOS TAB页下载,这里需要注意要选择
-
ARM开头的DMG呢还是X64呢,首先打开你得mac命令终端然后输入uname -a
-
所以当前我的mac就需要下载ARM64 DMG,下载后照着一直下一步即可
-
配置环境变量
选择.dmg安装的mac将自动配置java环境变量,选择.tar.gz安装方式则需要手动配置
-
使用
java -version
验证是否安装成功。 -
但仍然将手动安装or改变java版本的操作方法留存于此
-
在访达中找到JAVA的安装路径默认为:/Library/Java/JavaVirtualMachines,也可以自己尝试在访达中找到后按Option / ⌘ + C可以复制当前路径。
-
打开命令行窗口输入
echo $SHELL
来查看当前mac使用的shell类型也就是当前mac系统用来解释或翻译你输入命令的类型,不同类型的shell将需要配置不同的文件
这里我的是zsh也是mac系统默认的。zsh使用的 .zshrc,而bash使用的 .bash_profile
-
在命令行中输入
cd ~/
这是回到当前用户家(根)目录
的命令(而后输入pwd
命令则可以看到以/Users/开头的某个用户目录) -
前面提到过如果你使用的是
bash shell
,在用户家目录下创建.bash_profile
文件,是zsh shell
,在用户家目录下创建.zshrc
文件.输入创建文件的命令touch 文件名
,而后用vim 文件名
来打开你刚才新建的文件。
10.英文状态下,输入i进行编辑模式:并且输入以下内容
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_361.jdk/Contents/Home
export PATH=$PATH:$JAVA_HOME/bin
需要注意的是,按下英文输入法时的i
键后左下角会有-- INSERT --
的提示证明已经可以输入,然后复制进去即可。(如果安装路径不同则需要修改JAVA_HOME=后面的值)
输入完成后按下ecs
案件退出编辑模式。按下后-- INSERT --
消失
然后继续用英文输入法输入:wq 回车
即可保存,然后可以用cat 这个文件名字来查看是否写入成功
然后需要通过
source 文件名
来执行添加到系统环境变量中。最后通过java -version
来验证是否成功。
环境变量的解释
环境变量的配置是为了能够在你的计算机上执行java命令,也就是说要想让你的电脑明白java语言,让你的电脑知道有JAVA这么一回事。拓展(目前不明白没关系):操作系统的命令除了本身自带的以外,还允许开发人员对其命令集进行扩展。你锁配置的JAVA环境变量,就是在你的电脑上拓展JAVA命令集。
工具
- 常见工具
-
- eclipse
-
- idea(本文主要开发工具)
两者主要区别:
- eclipse是开源的,idea专业版收费。但是国内么,通常都会选择破解版本。对于初学者而言,社区版完全够用了。
- idea更适合用于大型项目的开发,运行的效率要远高于idea。eclipse开发大型项目经常卡顿。现在流行的也一般都是用idea。
- idea目录清晰,操作简单,eclipse较为杂乱不适合新手。
下载安装
- 点击链接IDEA官网点击右上角Download往下拉,ULtimate是完整版(收费),Community社区版本(免费)。
- 这里初学者选择社区版本
- 下载后随着步骤安装即可。
- 运行工具后可以看到如下界面
- 我们来做第一个动作创建一个工程也就是New Project
5.1 Name:工程名字,实战中通常可以是具体的业务领域名称或抽象的名词等。
5.2 Location:这个工程在你电脑的哪个目录上。
5.3 其它暂时都不用管,改好名字和目录Create即可。
5.4 最终idea会为我们生成这样的结构和基础的文件(每次idea重新启动都会默认恢复关闭前打开的项目、文件状态),同时idea会自动保存你修改的文件
,所以每次学习完之后直接关闭软件即可。
5.5 现在,我们下一个步就是开启编程之路了。
开始编程~
现在你需要做的事情是思考如何面对你打开的这个工程和文件界面。就如我之前所说,我们把编程应当放在以实际场景之后要考虑的事情。也就是说,比如我们现在要实现的是(假如也是你想实现的)餐厅点餐系统,同时假如你现在手上有非常多的不同的项目,某需求方A找你做的(订票系统)、某老板B找你做的(仓库管理系统),这个时候就需要使用项目来区分不同的项目不同的组织的内容(不同的代码放到不同项目)。
所以项目是一个抽象的概念,它代表着某种意志的具体名称、意义。也可以狭义的理解为归类某一系列。当然你也可以把你所有不同系统的代码放到一个目录,但是假设把你放在和你不同领域和不同认知的人群里,就会显得比较多余。
工程与目录
工程
可以思考一下我创建工程的名字,Basic-EDU
EDU是教育的缩写,基础教育。哪个领域的基础教育呢,我使用JAVA语言编程,所以JAVA基础教育在名字里就不用强调了,这是隐性的含义。
/.idea
目录,是配置(告诉)idea这个工具怎样来组织和帮助你解释运行你的代码的目录,目前你还不需要修改它,知道怎么回事就行。
/src
目录,这是JAVA规范,IDEA遵循了这个规范
,在你想要运行你的代码、打包你的代码时在工程目录下的这个文件夹下拉取你的源文件,从而组成要执行的。
规范
的意义,约束事件参与的角色的行为,搬砖工人
和水泥工人
把相应的材料放到约定的地点
,而后建筑工人
才知道我需要的材料应该去哪里找。
工程与目录的意义
创建工程时,idea为我们在src目录下自动创建了一个Main.java文件,这个.java后缀名称的文件是我们编写代码主要的文件。
试想一下如果我有一千节课,每一节课都需要不同的文件来进行演示。所以我们可以尽可能的对(一系列相同类型或者相同领域范围的).java文件进行归类。
如何归类,首先我不可能将所有的示例代码放到同一个.java文件中来进行演示。因为不方便我查找也不方便参考的人查找。其次全都放在src根目录下也显得特别的臃肿,试想你在你的桌面(桌面也是一个文件夹)放上几千个快捷图标,你会需要花费越来越多的时间来寻找你需要的。
所以我们通常把一系列领域相同&相互直接挂钩的代码,归类
到某个项目。同时在相同的领域里,还可以根据不同职责&不同逻辑进行更具体的分类,但是全都需要放到src目录下。
也就是说如果我想要做基础教育这件事情,并且有1000节课的代码需要演示。这个时候我就需要在src目录下去新建对不同课时需要演示的代码进行进一步的分类
所以需要知道的是规范&分类
规范规定了你一定要把所有的代码放到src目录下。你自身的分类需求导致在src目录下需要新建各种不同的文件夹Package
,两则同时形成了你的工程目录文件结构。
现在我在Lesson1下新建一个名叫Grammar的文件,通过工程目录可以分析成,这是一个基础的语法演示,并且是第一课。其实在真实项目中很多人并不会去遵循这种有规则性的命名,这是不好的,要养成好习惯,因为在真实的项目中往往这一套代码
不是你一个人在完成它。
语法的含义
前面说过,工程与目录是通过规范&归类
来组织的,这样才能有组织有纪律的进行你的项目。同样我们在编写我们的代码(通常是指.java的文件,比如上面新建的Grammar)时也需要遵循这样的规则。(不是说不可能随意的组织代码,恰恰实际情况中通常会很容易的随意组织代码和目录结构。也就是说我要求我自己在Grammar文件中只给你们示例基础语法,而不是给你们示例算法 or 某个工具或者把所有的课程内容都放在一个文件内容中。)
.java文件规范
相信你已经尝试了去新建文件夹和类(.java)文件,要注意idea已经帮助你把java规范的规则做了高亮,规范是硬性的,你必须这么做(这里是idea帮你做了,如果你不使用工具而是txt来编写也需要这些基础的内容),包括右下角的那个;
分号。
package
(包)是当前文件在当前工程中的目录,也就是说我新建的这个Grammar文件在电脑上实际是存在于~/IdeaProjects/Basic-EDU/src/Lesson1/Grammar.java
,至于这里的package
只有Lesson1
,是因为Idea帮你省略了Basic-EDU/
的前面部分。为什么没有src,也是因为规范
,规范有时候是隐式的,悄悄遵循的。public class ClassName(类名字)
这是用来标识你的文件是一个JAVA文件并且文件名称叫什么。PS:实际上java环境
最终会以包名.类名字
的形式用来作为你这个文件的唯一标识
。因为我们都知道在同一个文件夹下是不能有相同的文件夹或者文件的。但是我们工程
需要加载的是全部子目录下的文件的,不同目录下的文件名相同了就可以这样的方式来进行区分。- 细心的同学可能发现了
public static void main
和public static void test
的区别,main
是被高亮的test
没有(其它地方全都完全一样)。要知道所有被IDEA高亮显示的都是JAVA的关键字,也就是语法。这里public static void main(String[] args)
语法是程序主入口
,也叫主函数
,一切程序的入口
和开始执行的地方
。 - 在做程序开发时所有的符号输入都是在英文输入法情况下打出来的,比如
{}
,;
,()
,[]
,,
,这些都是语法的关键部分。其中{}
标识的是一块内容的开始和结束,就像逗号句号一样,这里是告诉程序你这一部分内容从哪里开始到哪里结束,所以一定是成对出现的。()
功能类似,标识的是某一小块部分的开始结束。;
则是标识着一句话的结束。 - 先不要管
(String[] args)
的部分。 - 我们接下来要做的事情就是在
public static void main(String[] args){ 这里面体验我们的第一个程序 }
。 - 还记得新建项目时IDEA帮你自动生成的那个Main文件吗,现在你可以尝试运行它 1.双击打开Main文件 2.在文件内容中右击,然后选中 Run ‘Main.main()’
- 然后IDEA工具的底部输出了该程序运行的最终结果。
- 这里再引入一下下面要干的事情,一步一步的去实现模拟一个点餐系统
实现点餐系统超级基础版
在上面的演示中,有两个关键点我们需要在public static void main(String[] args){ 这里面体验我们的第一个程序 }
,并且在这个代码块中,我们输出了两句话,可见System.out.println("这个部分");
是用来输出我们的结果的,这是JAVA系统自带的功能。
现在需要思考,餐厅点餐系统应该从哪里开始实现呢?我们列举一下步骤:
- 【用户】打开点餐系统的界面 -> 2. 【程序】自动展示系统内容-> 3. 【用户】选择点的餐 -> 4.【程序】反馈点餐结果
实现第一步 给用户展示餐厅界面
其实所谓的系统展示界面,它可以是命令行(windows中的cmd
,mac中的shell
),也可以是电脑软件的界面,也可以是手机APP的界面。它们的功能是一样的,就是为了给用户不同的提示引到用于去使用。只不过我们现在实现的是命令行版本罢了。
实现第二步 提供用户输入的功能
现在我们已经给用户展示了我们系统的内容,但是实际上也只是仅仅做了展示,还什么都没有做。那么用户在输入这个动作时,在程序中需要完成:1.提供用户输入的功能,2.接收用户输入的值,3.判断用户输入的内容
变量!
用户在输入后,我们要将用户输入的值找地方保存下来,这样才能用于后面区分用户选择的什么内容。那么这样一个东西他就叫变量
,顾名思义它是变
的。试想如果没有变量的存在,那么程序将毫无转折
可言,程序的执行结果就像我们上面演示的程序一样,无论你执行多少遍,它都是一样的运行结果。
在我们日常生活中经常接触的有:
- 整数字12345 它在java中需要用
int
关键字来保存- 带小数点的 3.1415 它需要用
double
关键字来保存- 中英文文文字 “听我数” 中英文文文字+数字 “听我数123” 它需要用
String
类型来保存具体的表现形式是(对应上面的123):
int a = 1; int b = 2;
, a,b就是变量名称,和项目、包名一样,是通过你需要对它赋予的意义进行命名或者随意的去命名。double a = 1.1; double b=2.2;
所有的关键字前后都需要用空格隔开String a = "听我数"; String b = "听我数123;"
这个在程序中叫做字符串,就是一串字符(中英文或数字符号等)组成的内容。现在我们将它们输入到程序里:
package Lesson1; public class Grammar { public static void main(String[] args) { int a = 1; int b = 2; double a = 1.1; double b=2.2; String a = "听我数"; String b = "听我数123;"; System.out.println("这里是点餐系统【示例程序】"); System.out.println("请点餐,本店有:"); System.out.println("1.蛋炒饭 2.扬州炒饭"); } }
可以发现,在
第6行,第7行
的double
,String
关键字定义的变量名a or b
下面有红色波浪线,这是工具在提示你语法错误(这是txt无法做到的)。同一个包下不能有一样名字的类文件,同样一对{}
括号的代码块内(通常理解为一个整体)是不能拥有相同的变量名的。
同时现在要做的是定义一个变量接收用户输入的选择,这里我们需要将它设计为数字的输入,这样用户只需要输入1 or 2,而不是打字。所以我们需要一个接收用户输入的整数型的变量int customerInput = 0;
写成int customerInput;
,前者意义的不同是定义这个变量并且赋予了一个初始值0
。
变量定义之后,刚才提到我们现在是基础版命令行程序
。所以需要接收到用户在命令行的输入。在java中,有三种非常重要的元素
- 关键字(上面提到过的IDEA帮助你高亮的那些)
- JAVA语言本身自带的程序功能
- 你通过JAVA语言扩展实现的你的功能
所以现在我们需要借助第二点,引入java本身自带的功能来接收用户在命令行的输入。
package Lesson1;
//import关键字就是导入JAVA本身自带的功能到你这个文件中
import java.util.Scanner;//1你可以尝试删除这句话
public class Grammar {
public static void main(String[] args) {
int customerInput;
System.out.println("这里是点餐系统【示例程序】");
System.out.println("请点餐,本店有:");
System.out.println("1.蛋炒饭 2.扬州炒饭");
Scanner scanner = new Scanner(System.in);//2删除后这里会报错
customerInput = scanner.nextInt();
System.out.println(customerInput);
}
}
import
是语法,目的是导入在java.util包下的Scanner文件。其含义和我这里的包Lesson1
加文件名Grammar
之后Lesson1.Garmmar
一样,java把父子目录通过.
的形式组合起来,为某个类文件最终的唯一标识。
import
是为了将相应的java自带功能做提前引入
,而Scanner scanner = new Scanner(System.in);
才是做真正的使用声明(先造着做,后面会讲的)。
直到customerInput = scanner.nextInt();
才是真正的在使用通过import
引入的这个功能,
需要注意的以下几点:
1.变量customerInput
在代码的前部分通过关键字int
声明之后,在此{}代码块内,具体使用时
,不需要再加int
关键字,因为它是定义的功能,如果加了就是前面提到的报错,因为你尝试在此{}代码快内
重新声明一个相同名字的变量。
2. 只要是=
出现的地方就是在赋值
,在customerInput = scanner.nextInt();
是将变量customerInput
赋值的过程交给了用户在命令行的输入,而scanner.nextInt();
具备的是完成了用户命令行输入并把输入传递给你的功能
。
3. 可以尝试着理解System.out系统输出
与System.in系统输入
的字面含义,至于在语法上的区别,下一课会详细讲。
程序运行后和刚才不一样的地方是1.红色的按钮并没有变灰(这证明程序的运行还没有终止)2.如果左击整个Run的控制台
或者叫命令行
都可以。会有一个光标出现此时你可以在光标出现的地方输入任意整数数字,并回车。
在运行结果中,可以发现
1.红色的标变灰色了,程序运行结束了
2.绿色1是你从命令行输入到程序的【输入】
3.白色1则是最后一句代码,将接收你输入内容的变量打印到命令行【输出】
实现第三步 根据用户的输入进行判断与转折
现在我们接收到了用户在操作界面的选择,但是在程序的世界里,它是不知道用户将会输入什么内容的。它需要做的事情是在用户做出选择后自动的去完成后续的事情,用户只需要看到最终的结果,而不是自己输入了什么就返回什么。
判断
使用if
可以对用户的输入进行判断,这也是java中的关键语法
,它由if (判断条件) { 满足条件后要处理的事情 }
与else if (如果if块中不满足后的判断条件) { 满足条件后要处理的事情 }
与 else { 如果前面的 if 和 else if中的条件都不满足则处理的事情}
,需要注意以下几点:
- 代码中所有的符号都必不可少,是语法中的一部分
()
或{}
等,并且它们都是成对的出现; - 在
if
语法中,执行的顺序和书写的顺序都是if
-else if
-else if
-else if
-else
,if
最前,else
最后,else if在中间
,并且它可以有多个,而if和else只能有一个。 =
符号通常用于赋值,==
符号通常用于比较两个值是否相等
现在你可以对比代码尝试理解,并且运行,甚至尝试对代码进行修改,比如增加菜品
package Lesson1;
import java.util.Scanner;//import关键字就是导入JAVA本身自带的功能到你这个文件中
public class Grammar {
public static void main(String[] args) {
int customerInput;
System.out.println("这里是点餐系统【示例程序】");
System.out.println("请点餐,本店有:");
System.out.println("1.蛋炒饭 2.扬州炒饭 3.拉面");
Scanner scanner = new Scanner(System.in);
customerInput = scanner.nextInt();
if(customerInput == 1) {
System.out.println("开始做蛋炒饭");
} else if (customerInput == 2) {
System.out.println("开始做扬州炒饭");
} else if (customerInput == 3) {
System.out.println("开始做拉面");
} else {
System.out.println("对不起没有这道菜");
}
}
}
让对括号 () [] {} 成为你的习惯
一对括号 [] 或 {}
通常表示的是一个更小的世界,前期需要格外关注它们的嵌套关系,以及什么时候用什么样的括号。这个是需要基础的记忆的。
public class Grammar { }
用{}
标识了Grammar这个文件的开始和结束,而main就是这个文件里面具备的功能之一。public static void main(String[] args) {}
用{}
圈定了某个具体功能的开始和结束,也就是具体的代码逻辑。变量的定义,判断,程序的输入输出。System.out.println("这里是点餐系统【示例程序】")
用()
圈定了在**本句话(代码)**中要在控制台输出的全部内容。if(customerInput == 1){System.out.println("开始做蛋炒饭");}
用()
圈定了判断条件customerInput == 1
来判断用户输入的是不是1,用{}
圈定了如果输入的是1将要做的事情。- 可以粗暴的理解为嵌套越多,程序就复杂。同时也意味着程序功能越多。
实现第四步 循环
到现在为止,这样的这个程序就具备了基础的业务逻辑
,但是不难发现,它是执行1次之后就不再执行了。在真实的场景下,不可能是某个APP用一次就没了。所以真实的程序,它是一直都在循环
执行的。
在这个小程序里从实际出发,要循环哪一部分内容呢?循环的是用户选餐完成之后,还继续回到选餐的界面,也就是提示部分。所以我们应当用循环语法将我们需要被反复循环的内容包起来。并且,提供给用户退出循环的功能。整体的流程如下:
怎么做
-
用可以循环的语法将整个完整功能的代码块
包起来
。 -
提供退出循环的功能,比如
退出
java语言中提供了一些循环嵌套的不同语法,在这里我只演示
for(){}
循环,其它的循环我希望你自发的去查找资料以及练习,比如从csdn java技能树中查找其它循环语法来替代for循环的功能。
以图片展示的为基础,我们现在加入循环语法将该部分嵌套进来。
package Lesson1;
import java.util.Scanner;
public class Grammar {
public static void main(String[] args) {
for (;;){
//循环开始
int customerInput;
System.out.println("这里是点餐系统【示例程序】");
System.out.println("请点餐,本店有:");
System.out.println("1.蛋炒饭 2.扬州炒饭 3.拉面");
Scanner scanner = new Scanner(System.in);
customerInput = scanner.nextInt();
if(customerInput == 1) {
System.out.println("开始做蛋炒饭");
} else if (customerInput == 2) {
System.out.println("开始做扬州炒饭");
} else if (customerInput == 3) {
System.out.println("开始做拉面");
} else if (customerInput == 4) {
System.out.println("程序退出");
break;
} else {
System.out.println("不能识别");
}
//循环结束
}
}
}
在程序中我们使用了
for (;;) {}
的结构达成了循环程序功能
的效果并且不限次数(死循环)
。在用户输入的是数字4
时执行了break;
命令,达成了打断循环的效果(退出程序)。这是我自己的运行效果:
新手必看
1. 当你接触一项完全新的内容时,如果觉得很迷茫,拿交朋友来做比方。通常刚认识的时候别人是无法跟你推心置腹的。必须是有一个熟悉的过程。
2. 对于学习一个完全不同的领域,从入门到精通整个过程,我个人认为都是在不断怀疑打翻推倒重来的过程。因为相同的知识点,相同的道理。在不同的阶段,从新手到高手对相同的事情都会有不同的见识见解,越来越深。
3. 当无法理解时,从实际的需求
出发,什么语法
能够帮助你完成什么功能和内容即可。
4. 多练习(将代码反复的删除重写,我没有讲到的点多去大胆的查文献资料),多思考(自己改变程序的逻辑,或者自己设定设计一个其它的场景,其实代码还是这么一些代码,本质都不会改变)
5. 至于后续,把心放踏实,我都会将整个内容由浅入深的为你们介绍。
作业
- 思考&尝试抽象现实中的场景来进行模仿+创新。