Notes 20180507 : Java程序设计之环境搭建与HelloWord

3 HelloWorld  

  不管从事什么工作那么一个工作环境总是必不可少的,那怕你只是要写篇文章,一张平坦的书桌和流利的书写笔总是能帮助我们完成工作的,Java开发更是如此。在开始今天的HelloWorld前,我们先来聊一聊Java的基本环境搭建

3.1 Java环境的搭建

  工欲善其事必先利其器。在学习Java语言之前,必须了解并搭建好它所需要的开发环境。要编译和执行Java程序,JDK(Java Developers Kits)是必备的。下面将具体认识下JDK和JRE,并进行介绍下载安装JDK和配置环境变量的方法。实际上很多时候我们简单的将JDK称为Java的开发环境,这也能看出它的重要性。下面我们聊一下与Java开发环境有关的一些重要概述,开始之前还是要复习和赘述一下跨平台。

3.1.1 Java的跨平台

  跨平台概念是软件开发中一个重要的概念,即不依赖于操作系统,也不依赖硬件环境。一个操作系统下开发的应用,放到另一个操作系统下依然可以运行。相对而言如果某种计算机语言不用修改代码即可做到高度跨平台,那么此语言就越抽象,硬件控制力就越低(即对于硬件的局限能力就越低),只适合开发高度抽象的模型系统。诸如Java,delphi和易语言,都已做到了跨平台。它们将可以在多种系统下开发、运行和维护有了这个了解,下面我们讲一下Java的跨平台。

  Java的跨平台是指:通过Java语言编写的应用程序在不同的系统平台上都可以运行。在这里我们要对平台进行一下解读,我们知道OS的出现为所有的开发提供了一系列的开发接口,所有现在的驱动和高级开发语言都是通过OS提供的接口来实现开发的,而无需再考虑CPU的指令集,所以这里的平台指的就是OS,Java编写的程序可以在不同的OS上运行,我们日常工作中往往是在Windows上开发的,但是部署却是在Linux上,这就是跨平台的最好解释。

  原理是:Java编写的源代码经过一次编译后生成符合JVM规范的中间码,编译后的字节码采用一种针对JVM优化过的机器码形式保存。这个中间码不管编译多少次都是一样的,在需要运行的Java应用程序的平台上,JVM会将中间码解释为能够被计算机识别的机器码,所以编译只进行一次,而解释却是在程序每次运行时都需要进行的。如下图1.6所示。

 

 

图1.6   Java的跨平台性的原理

  因为有了JVM,所以同一个Java程序在三个不同的操作系统中都可以执行。这样就实现了Java程序的跨平台性。也称为Java具有良好的可移植性。Java语言是跨平台的,而JVM不是跨平台的。

  通过Java的发展历史,我们知道Java开发的初衷就是为了应对快速发展的硬件,可以做到我们编写的代码不会随着硬件环境的改变而出现不适应的情况。发展到了今天,特别是互联网成为日常生活一部分的时候,我们编写的代码面对着庞大用户的同时,也面对着各种各样的部署环境,此时跨平台尤为重要,比起为不同平台开发不同的软件,开发有限的几个版本的JVM,看起来更容易开发一些。

3.1.2 JDK

  JDK是 Java 语言的软件开发工具包,是提供给Java开发人员使用的,是Java开发的最小环境,其中包含了java的开发工具,也包括了JRE(Java的运行环境)。所以安装了JDK,就不用再单独安装JRE了。JDK包含的基本组件包括:

  • javac – 编译器,将源代码转成字节码
  • jar – 打包工具,将相关的类文件打包成一个文件
  • javadoc – 文档生成器,从源码注释中提取文档
  • jdb – debugger,查错工具
  • java – 运行编译后的java程序(.class后缀的)
  • appletviewer:小程序浏览器,一种执行HTML文件上的Java小程序的Java浏览器。
  • Javah:产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件。Java中是可以调用本地代码的,此时就用到了这个功能。
  • Javap:Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。
  • Jconsole: Java进行系统调试和监控的工具

为什么JDK中包含一个JRE呢?

其一,开发完的程序,总需要运行一下看看效果。

其二,也是最重要的,JDK中的开发工具其实都是java语言编写的应用程序,为了方便使用才打包成exe文件,如果没有JRE,那么这些工具是运行不了的。

3.1.3 JRE

  JRE(Java Runtime Environment,Java运行环境),运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。

  简单而言:使用JDK开发完成的java程序,交给JRE去运行。

3.1.4 JDK下载

  Java的JDK又称Java SE(以前称J2SE),是Sun公司的产品,由于Sun公司已经被Oracle公司收购,因此JDK可以在Oracle公司的官方网站http://www.oracle.com/index.html下载。在Java 5 之后,J2SE、J2EE和J2ME正式更名,将名字中的2去掉,分别更改为Java SE、Java EE和Java ME

  下面以JDK 最新版本为例介绍下载安装JDK的方法,具体步骤如下:

  • 打开IE浏览器,输入网址“http://www.oracle.com/technetwork/java/javase/downloads/index.html”,浏览Oracle官网,将光标移动当Downloads菜单项上,将显示下载列表下拉菜单,单击Java for Developers 超链接,如图1.7所示。

 

图1.7   Oracle主页

  • 将跳转到JDK的下载页面,在该页面中单击最新版本JDK的超链接,即如图1.8所示的Download按钮。

 

 

图1.8   JDK的下载页

  • 在进入的新页面中,需要先选中同意协议中的单选按钮,这时将显示如图1.9所示的页面,否则单击要下载的链接时不能进行下载。

 

 

图1.9   JDK最新版本的下载页面

下载时要选择适合自己操作系统平台的的安装文件,如Windows系统平台是无法安装Linux系统平台的安装文件的。如果我们需要一些旧版本的JDK则可以在进入JDK的下载链接页面后选择旧版本下载,单击进入历史页面,我们以JDK 7 为例如图1.10所示。

图1.10   历史版本的JDK下载

3.1.5 Windows系统的JDK环境

3.1.5.1 JDK的安装

我们以下载的JDK 7为例进行安装介绍,步骤如下:

 

 

JavaFX是由甲骨文宣布推出的,是一款为企业业务应用提供的先进Java用户界面(UI)平台,它能帮助开发人员无缝的实现与本地java功能及Web技术动态能力的混合与匹配。

3.1.6 配置JDK

  在安装完JDK后需要对环境变量进行配置,具体步骤如下所示。【如果有兴趣可以阅读本人一篇文章:我们为什么要配置环境变量

3.1.6.1 path环境变量配置的作用

  • 程序的执行需要使用外部指令javac,但是javac指令仅仅能在JDK安装目录下的bin目录下时候,因此程序只能写入bin目录
  • 程序开发过程中,不能将源代码写入JDK的安装目录,因此需要将源程序保存到任意位置的指定目录(英文目录),所以需要使javac指令在任意目录下可以运行。

3.1.6.2 path环境变量配置方式

  • 通过配置path环境变量,将javac指令所在目录也就是JDK安装目录下的bin目录配置到path变量下,即可使javac指令在任意目录下运行
  • win7,win8系统:右键点击桌面计算机→选择属性→选择高级系统设置→选择高级选项卡→点击环境变量→下方系统变量中查找path→双击path
  • XP系统:右键点击桌面计算机→选择属性→选择高级选项卡→点击环境变量→下方系统变量中查找path→双击path将jdk安装目录下的bin目录添加到最左边并添加分号

 

  • path环境变量的参照形配置方式

创建新的变量名称:JAVA_HOME,为JAVA_HOME添加变量值:JDK安装目录,将path环境变量中JDK目录修改,%JAVA_HOME%\bin;,path环境变量具有先后顺序

 

我们配置成功后发现javac和java可以到处运行

 

3.1.6.3 classpath环境变量配置方式

  我们配置成功path环境变量后发现java和javac可以到处运行,那么此时我们已不必将源代码放入bin目录下了,但是我们遇到这么一个问题就是,源文件中引用的工具类找不到此时该怎么办呢?其实这是因为Java是一种面向对象的编程语言,提供了很多开发工具类,我们在自己的代码中引用了这些类(这些类有可能不在一个文件目录下),那么是不是该告诉编译器去哪找这些工具类呢,配置CLASSPATH的目的就在于此,指定寻找.class的路径。最初配置CLASSPATH,因为jre找不到自带的类库。jdk1.5后,就不需要配置了

 

CLASSPATH_8_64=.;D:\Java\JDK\JDK-1.8-64\lib;D:\Java\JDK\JDK-1.8-64\lib\tools.jar

作用:使classpath目录中的.class文件可以在任意目录运行

  • 技巧:通常将配置的目录最前面添加.配置,即当前目录,使.class文件搜索时首先搜索当前目录,然后根据目录配置的顺序依次查找,找到后即运行,因此classpath目录中的配置存在先后顺序

小知识:rt.jar是JAVA基础类库,dt.jar是关于运行环境的类库,tools.jar是工具类库

1.rt.jar 默认就在 根classloader的加载路径里面 放在claspath是多此一举,不信你可以去掉classpath里面的rt.jar,然后用 java -verbose XXXX 的方式运行一个简单的类 就知道 JVM的系统根Loader的路径里面

不光rt.jar jre\lib下面的大部分jar 都在这个路径里

2.tools.jar 是系统用来编译一个类的时候用到的 也就是javac的时候用到,实际上tools中放置的是Java提供的一些开发工具类

javac XXX.java   实际上就是运行java -calsspath=%JAVA_HOME%\lib\tools.jar xx.xxx.Main XXX.java    javac就是对上面命令的封装 所以tools.jar 也不用加到classpath里面

3.dt.jar是关于运行环境的类库,主要是swing的包你要用到swing时最好加上

  jdk1.5版本之前必须配置classpath,jvm虚拟机才能找到.class文件,1.5版本以后jvm虚拟机会默认在当前目录去找.class文件,所以我们现在的1.7版本可以不配置classpath,因为没有意义,但建议配置,考虑向下兼容的问题。可以参见https://blog.csdn.net/pengpenglin/article/details/1682858加深理解。

3.1.7 总结

  path环境变量里面记录的是可执行性文件,如.exe文件,对可执行文件先在当前路径去找,如果没找到就去path环境变量中配置的路径去找

  classpath环境变量里记录的是java类文件中引用的外部工具类文件所在的目录,我们知道Java是一种面向对象的高级编程语言,说白了,就是我们编程时是可以将一些已经写好的工具类当做对象来使用的,通过对象来帮助我们简略开发,就如同字符串的截取等,我们不用自己去写只要调用String的相应方法既可,可我们通过一些非IDE编写的代码,是没有包导入的,此时就用到了ClassPath,它告诉编译器到哪里找需要执行的.class文件。在这里我们要把.java和.class的路径区别开。

(1).何时需要使用-classpath:当你要编译或执行的类引用了其它的类,但被引用类的.class文件不在当前目录下时,就需要通过-classpath来引入类
(2).何时需要指定路径:当你要编译的类所在的目录和你执行javac命令的目录不是同一个目录时,就需要指定源文件的路径(CLASSPATH是用来指定.class路径的,不是用来指定.java文件的路径的)

3.2 第一个Java程序“Hello World”

3.2.1 工具介绍

编写Java程序可以使用很多种工具

  • notepad(微软操作系统自带)
  • Notepad++
  • Eclipse
  • MyEclipse

我们在初始学习阶段先通过Notepad++来学习,这样我们可以更直观的看到程序运行的流程。

3.2.2 HelloWorld

源代码

复制代码
复制代码
class HelloWorld{
  public static void main(String[] args){

    System.out.print("Hello World;");

    System.out.println("Hello World;");

  }
}
复制代码
复制代码

将源代码存放在K:\WorkSpace\JavaJC\Chapter 1

此时我们打开命令行,定义到JDK的目录下,

此时我们编译程序会发现

原因在于javac.exe它只会编译bin目录下的文件,而HelloWorld.java不在当前bin目录下,我们将需要编译的文件放在当前bin目录下,重新编译发现提示编码错误错误,这是我们可以解决错误提示:编码 GBK 的不可映射字符,使用命令:javac -encoding utf-8 helloword.java,编译成功--这句的意思是使用编码字符集utf-8来编码HelloWord.java,然后编译执行

运行我们编译成功的class

 

在这里我们要注意当我们更改源文件时,我们在运行可执行文件.class时,如果没有编译,那么更改是无效的,简单举例:当我们将HelloWorld.java中再加入一句输入语句System.out.print(“未经编译的举例”);此时我们不编译,直接运行可执行文件,

 

输出结果是上一次我们编译后的呈现,我们重新编译,重新执行,这次变化才会显示出来,这是因为我们我们写的源码和JVM执行的中间码中间要经过一个编译。

 

3.2.3程序解析

复制代码
复制代码
class Demo{  /*首先定义一个类  class 类名  这个类名将是未来我们编译后的字节码文件名

             在类定义后加上一对大括号{}*/

 /*在大括号中间添加一个主(main)方法/函数  public static void main(String [] args){ } main是给类定义的方法,当类作为包中的主类时,必须要有main方法,main方法是程序的入口,当程序执行时,优先调用它。然后在main方法中再调用别的类和方法,就完成了程序。*/

public static void main(String[] args){

/*在主方法的大括号中间添加两行输出语句 System.out.print(“hello world”); System.out.println(“hello world”);Ln的区别在于是一个回车 有Ln代表有一个回车*/

System.out.print("Hello World");

System.out.println("Hello World");

}

}
复制代码
复制代码

当我们不输入main方法时,我们的编译仍可进行,但执行可执行文件时汇报错误

 

main是程序的入口;就好像我们回家要开门一样,FQ是会被打的。

3.2.4运行与工作原理

 

3.2.5常见错误

  • 文件扩展名隐藏导致编译失败
  • class写错 Class claas…
  • 类名格式有问题 暂时全部使用英文
  • 类名后面的大括号匹配不正确
  • main方法格式错误 public static void main(String [] args){ }
  • main方法大括号缺失
  • 打印语句拼写错误 System.out.println(“”);
  • 引号使用错误,使用成中文全角引号

如果编译后无法生成可执行文件一般可以按以下步骤进行排查,找到问题所在:

1.先检查jdk环境是否配置成功

  做法:DOS下输入:java -version,看是否有jdk版本的信息;java,看是否有相关命令;javac,看是否有这个命令;验证这3个命令,会对jdk环境配置有个直观的认识,如果没有正常显示相关信息,就要去配置jdk环境,具体步骤可参考百度经验。

2.检查路径是否正确

  做法:DOS下输入:dir,查看当前路径下是否真的有这个HelloWorld.java文件

3.通过命令 javac -d 你想生成class文件的目录 HelloWorld.java 来查看是否有class文件

  做法:DOS下输入:javac -d C:\ HelloWorld.java  ,运行后,看是否在C盘下有HelloWorld.class文件

题外深入知识点

Knowledge Point 20180303 :对比编译器、解释器与Javac编译原理

Knowledge Point 20180303 详解main函数

posted @ 2018-05-06 02:12  十月十四  阅读(409)  评论(0编辑  收藏  举报