┌─┌──────────────────────────────────┐││Compiler,debugger,etc.│
│└──────────────────────────────────┘
JDK┌─┌──────────────────────────────────┐
││││
│JRE│JVM+RuntimeLibrary│
││││
└─└─└──────────────────────────────────┘
┌───────┐┌───────┐┌───────┐┌───────┐
│Windows││Linux││macOS││others│
└───────┘└───────┘└───────┘└───────┘
要学习Java开发,当然需要安装JDK了。
那JSR、JCP……又是啥?JSR规范:JavaSpecificationRequestJCP组织:JavaCommunityProcess为了保证Java语言的规范性,SUN公司搞了一个JSR规范,凡是想给Java平台加一个功能,比如说访问数据库的功能,大家要先创建一个JSR规范,定义好接口,这样,各个数据库厂商都按照规范写出Java驱动程序,开发者就不用担心自己写的数据库代码在MySQL上能跑,却不能跑在PostgreSQL上。所以JSR是一系列的规范,从JVM的内存模型到Web程序接口,全部都标准化了。而负责审核JSR的组织就是JCP。一个JSR规范发布时,为了让大家有个参考,还要同时发布一个“参考实现”,以及一个“兼容性测试套件”:RI:ReferenceImplementationTCK:TechnologyCompatibilityKit比如有人提议要搞一个基于Java开发的消息服务器,这个提议很好啊,但是光有提议还不行,得贴出真正能跑的代码,这就是RI。如果有其他人也想开发这样一个消息服务器,如何保证这些消息服务器对开发者来说接口、功能都是相同的?所以还得提供TCK。通常来说,RI只是一个“能跑”的正确的代码,它不追求速度,所以,如果真正要选择一个Java的消息服务器,一般是没人用RI的,大家都会选择一个有竞争力的商用或开源产品。安装JDK因为Java程序必须运行在JVM之上,所以,我们第一件事情就是安装JDK。搜索JDK20,确保从Oracle的官网下载最新的稳定版JDK:JavaSEDevelopmentKit20downloadsLinuxmacOSWindows
-------
x64CompressedArchiveDownload
x64InstallerDownload
x64MSIInstallerDownload
选择合适的操作系统与安装包,找到JavaSE20的下载链接Download,下载安装即可。Windows优先选x64MSIInstaller,Linux和macOS要根据自己电脑的CPU是ARM还是x86选择合适的安装包。
设置环境变量安装完JDK后,需要设置一个JAVA_HOME的环境变量,它指向JDK的安装目录。在Windows下,它是安装目录,类似:C:\ProgramFiles\Java\jdk-20在Mac下,它在~/.bash_profile或~/.zprofile里,它是:
exportJAVA_HOME=`/usr/libexec/java_home-v20`然后,把JAVA_HOME的bin目录附加到系统环境变量PATH上。在Windows下,它长这样:
Path=%JAVA_HOME%\bin;<现有的其他路径>在Mac下,它在~/.bash_profile或~/.zprofile里,长这样:
exportPATH=$JAVA_HOME/bin:$PATH把JAVA_HOME的bin目录添加到PATH中是为了在任意文件夹下都可以运行java。打开命令提示符窗口,输入命令java-version,如果一切正常,你会看到如下输出:
┌────────────────────────────────────────────────────────┐│CommandPrompt-□x│
├────────────────────────────────────────────────────────┤
│MicrosoftWindows[Version10.0.0]│
│(c)2015MicrosoftCorporation.Allrightsreserved.│
││
│C:\>java-version│
│javaversion"20"...│
│Java(TM)SERuntimeEnvironment│
│JavaHotSpot(TM)64-BitServerVM│
││
│C:\>│
││
││
└────────────────────────────────────────────────────────┘
如果你看到的版本号不是20,而是15、1.8之类,说明系统存在多个JDK,且默认JDK不是JDK20,需要把JDK20提到PATH前面。
如果你得到一个错误输出:┌────────────────────────────────────────────────────────┐│CommandPrompt-□x│
├────────────────────────────────────────────────────────┤
│MicrosoftWindows[Version10.0.0]│
│(c)2015MicrosoftCorporation.Allrightsreserved.│
││
│C:\>java-version│
│'java'isnotrecognizedasaninternalorexternalcomm│
│and,operableprogramorbatchfile.│
││
│C:\>│
││
││
││
└────────────────────────────────────────────────────────┘
这是因为系统无法找到Java虚拟机的程序java.exe,需要检查JAVA_HOME和PATH的配置。
可以参考如何设置或更改PATH系统变量。JDK细心的童鞋还可以在JAVA_HOME的bin目录下找到很多可执行文件:java:这个可执行程序其实就是JVM,运行Java程序,就是启动JVM,然后让JVM执行指定的编译后的代码;javac:这是Java的编译器,它用于把Java源码文件(以.java后缀结尾)编译为Java字节码文件(以.class后缀结尾);jar:用于把一组.class文件打包成一个.jar文件,便于发布;javadoc:用于从Java源码中自动提取注释并生成文档;jdb:Java调试器,用于开发阶段的运行调试。第一个Java程序我们来编写第一个Java程序。打开文本编辑器,输入以下代码:publicclassHello{publicstaticvoidmain(String[]args){
System.out.println("Hello,world!");
}
}
在一个Java程序中,你总能找到一个类似:
publicclassHello{...
}
的定义,这个定义被称为class(类),这里的类名是Hello,大小写敏感,class用来定义一个类,public表示这个类是公开的,public、class都是Java的关键字,必须小写,Hello是类的名字,按照习惯,首字母H要大写。而花括号{}中间则是类的定义。
注意到类的定义中,我们定义了一个名为main的方法:publicstaticvoidmain(String[]args){...
}
方法是可执行的代码块,一个方法除了方法名main,还有用()括起来的方法参数,这里的main方法有一个参数,参数类型是String[],参数名是args,public、static用来修饰方法,这里表示它是一个公开的静态方法,void是方法的返回类型,而花括号{}中间的就是方法的代码。
方法的代码每一行用;结束,这里只有一行代码,就是:System.out.println("Hello,world!");它用来打印一个字符串到屏幕上。
Java规定,某个类定义的publicstaticvoidmain(String[]args)是Java程序的固定入口方法,因此,Java程序总是从main方法开始执行。注意到Java源码的缩进不是必须的,但是用缩进后,格式好看,很容易看出代码块的开始和结束,缩进一般是4个空格或者一个tab。最后,当我们把代码保存为文件时,文件名必须是Hello.java,而且文件名也要注意大小写,因为要和我们定义的类名Hello完全保持一致。如何运行Java程序Java源码本质上是一个文本文件,我们需要先用javac把Hello.java编译成字节码文件Hello.class,然后,用java命令执行这个字节码文件:┌──────────────────┐│Hello.java│◀──sourcecode
└──────────────────┘
│compile
▼
┌──────────────────┐
│Hello.class│◀──bytecode
└──────────────────┘
│execute
▼
┌──────────────────┐
│RunonJVM│
└──────────────────┘
因此,可执行文件javac是编译器,而可执行文件java就是虚拟机。
第一步,在保存Hello.java的目录下执行命令javacHello.java:$javacHello.java如果源代码无误,上述命令不会有任何输出,而当前目录下会产生一个Hello.class文件:
$lsHello.classHello.java
第二步,执行Hello.class,使用命令javaHello:
$javaHelloHello,world!
注意:给虚拟机传递的参数Hello是我们定义的类名,虚拟机自动查找对应的class文件并执行。
有一些童鞋可能知道,直接运行javaHello.java也是可以的:$javaHello.javaHello,world!
这是Java11新增的一个功能,它可以直接运行一个单文件源码!
需要注意的是,在实际项目中,单个不依赖第三方库的Java源码是非常罕见的,所以,绝大多数情况下,我们无法直接运行一个Java源码文件,原因是它需要依赖其他的库。小结一个Java源码只能定义一个public类型的class,并且class名称和文件名要完全一致;使用javac可以将.java源码编译成.class字节码;使用java可以运行一个已编译的Java程序,参数是类名。Java代码助手Java代码运行助手可以让你在线输入Java代码,然后远程运行后,在网页显示代码执行结果:
使用IDEIDE是集成开发环境:IntegratedDevelopmentEnvironment的缩写。使用IDE的好处在于,可以把编写代码、组织项目、编译、运行、调试等放到一个环境中运行,能极大地提高开发效率。IDE提升开发效率主要靠以下几点:编辑器的自动提示,可以大大提高敲代码的速度;代码修改后可以自动重新编译,并直接运行;可以方便地进行断点调试。目前,流行的用于Java开发的IDE有:EclipseEclipse是由IBM开发并捐赠给开源社区的一个IDE,也是目前应用最广泛的IDE。Eclipse的特点是它本身是Java开发的,并且基于插件结构,即使是对Java开发的支持也是通过插件JDT实现的。除了用于Java开发,Eclipse配合插件也可以作为C/C++开发环境、PHP开发环境、Rust开发环境等。IntelliJIdeaIntelliJIdea是由JetBrains公司开发的一个功能强大的IDE,分为免费版和商用付费版。JetBrains公司的IDE平台也是基于IDE平台+语言插件的模式,支持Python开发环境、Ruby开发环境、PHP开发环境等,这些开发环境也分为免费版和付费版。NetBeansNetBeans是最早由SUN开发的开源IDE,由于使用人数较少,目前已不再流行。使用Eclipse你可以使用任何IDE进行Java学习和开发。我们不讨论任何关于IDE的优劣,本教程使用Eclipse作为开发演示环境,原因在于:完全免费使用;所有功能完全满足Java开发需求。如果你使用Eclipse作为开发环境来学习本教程,还可以获得一个额外的好处:教程提供了一个基于Eclipse的IDE练习插件,可以直接在线导入Java工程!安装EclipseEclipse的发行版提供了预打包的开发环境,包括Java、JavaEE、C++、PHP、Rust等。从这里下载:我们需要下载的版本是EclipseIDEforJavaDevelopers:
根据操作系统是Windows、Mac还是Linux,从右边选择对应的下载链接。 注意:教程从头到尾并不需要用到EnterpriseJava的功能,所以不需要下载EclipseIDEforEnterpriseJavaDevelopers