澳门新浦京8455comNotes 20180507 : Java程序设计之环境搭建与HelloWord

澳门新浦京8455com 44

Java
扩展机制在Java教程中被描述为一种“通过标准可扩展的方式来让Java平台上所有应用使用自定义API”。正如在理解扩展机制进行类加载中描述的,“扩展框架充分使用了类加载代理机制”。这种机制会在rt.jar引导(boot)类加载之后,标准classpath中的类加载之前,加载扩展类。

工欲善其事,必先利其器。

3 HelloWorld  

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

扩展目录的工作机制在类的加载上与classpath有点类似。对Java应用程序来说,所有扩展目录下JAR文件包含的类都可以访问。然而,会有一些关键的不同点。这些区别会在下面的文字中高亮显示。

不过对于刚刚入门的菜鸟来说,最好的编辑器还是使用记事本。

3.1 Java环境的搭建

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

特征 Classpath 扩展机制(可选包)
作用域 典型的应用相关

  • -classpath/-cp
  • java.class.path
  • 可执行JAR Manifest的Class-Path

主机上所有可能的JRE

  • CLASSPATH环境变量
所有运行在特定JRE上的JVM

  • java.ext.dirs

各种主机上的JRE

  • Solaris: /usr/jdk/packages/lib/ext
  • Linux: /usr/java/packages/lib/ext
  • Windows: %SystemRoot%SunJavalibext
如何指定 .jar文件

  • 明确的通过名字来指定(包括 .jar
  • 使用通配符来匹配所有的.jar扩展

.class Files

  • 指定目录下的.class文件
所有在指定目录下的JAR文件都会被加载(即使扩展名不是.jar或者没有扩展名)
类加载顺序 引导和扩展类加载之后 引导类加载之后,classpath上的类加载之前

原因不外乎是熟悉语法结构,而不是使用IDE自动生成。

3.1.1 Java的跨平台

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

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

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

 澳门新浦京8455com 1

澳门新浦京8455com 2

 

图1.6   Java的跨平台性的原理

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

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

一个最重要且值得重视的问题是,扩展机制会找出所有jar格式的文件,即使文件后缀名不是.jar。这意味着,改变classpath中的jar文件后缀名以此逃过通配符的筛选,这种方法在扩展目录中行不通。

java 体系:

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,那么这些工具是运行不了的。

我会用一些简单的例子来展示一些上面提到的区别。接下来的两段代码是一个简单的HelloWorld类和一个main应用程序中的Main类。Main通过调用main方法来使用HelloWorld类。

J2SE  桌面应用的开发  JAVA SE  (接下来学习的目标)

3.1.3 JRE

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

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

HelloWorld.java

public class HelloWorld
{
   @Override
   public String toString()
   {
      return "Hello, World!";
   }
}

J2EE  企业级开发      JAVA EE

3.1.4 JDK下载

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

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

  • 打开IE浏览器,输入网址“
    for Developers 超链接,如图1.7所示。

 澳门新浦京8455com 3

图1.7   Oracle主页

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

 澳门新浦京8455com 4

 

图1.8   JDK的下载页

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

 澳门新浦京8455com 5

 

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

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

澳门新浦京8455com 6

澳门新浦京8455com 7

澳门新浦京8455com 8

澳门新浦京8455com 9

图1.10   历史版本的JDK下载

Main.java

import static java.lang.System.out;

public class Main
{
   public static void main(final String[] arguments)
   {
      out.println(new HelloWorld());
   }
}

为了展示classpath和扩展机制的主要区别,我将会把编译过的HelloWorld.class文件归档到一个jar包里,命名为HelloWorld.jar。并把它放在一个跟编译过的Main.class不同的目录下。

为了展示传统的classpath的使用,我把HelloWorld.jar放在一个叫做C:hello的目录下并且会用通配符访问JAR来给Main使用。下面的两个截图对此进行了展示。

澳门新浦京8455com 10
澳门新浦京8455com 11

以上两个截图说明,尽管我删掉了当前目录下的HelloWorld.class,Java
主应用仍然能加载它。这是因为Java
launcher被告知(通过-classpath这个可选参数)去C:hello目录下寻找。使用扩展机制,不需要把类放到当前目录或者指定到
classpath下就可以加载。接下来的截图展示了这一点。

澳门新浦京8455com 12

上面的截图说明,当某个类是在扩展目录下的某个JAR里,Java
launcher甚至不需要把HelloWorld.class放到同一个目录下或者在classpath中指定。这常常被用来说明使用扩展机制的优点。因为所有在这个JRE(或者可能是主机上的所有应用)上运行的程序都可以不用在classpath上指定就能看到扩展目录下的类。

使用传统classpath方式——指导应用去加载JAR中的类,包含.class文件的JAR文件必须以.jar结尾。接下来的截图展示了当把在
classpath引用的目录下的HelloWorld.jar重命名为HelloWorld.backup之后所发生的事情。

澳门新浦京8455com 13

上面这张图展示了当classpath引用的目录下JAR文件没有以.jar结尾时发生的NoClassDefFoundError异常。可能有点令人惊讶,扩展机制不是这样工作的。所有在扩展目录下的JAR文件,不管后缀名是什么甚至没有后缀名都会被加载。接下来的截图展示了这一点。

澳门新浦京8455com 14

这张图展示了,给在扩展目录中的JAR文件重命名为没有后缀的文件并不妨碍类加载器加载JAR文件中的类。换句话说,类加载机制是通过文件类型而不是文件名或后缀来加载所有在扩展目录中的JAR文件的。正如可选包(Optional
Package)概览所总结的,“JAR文件本身没有什么特别的地方,其中包含的class文件也没有让JAR成为已安装过的可选包。只有位于jre/lib/ext下,才可能让JAR成为已安装的可选包。”

在扩展目录中放包含太多类定义的JAR会有一些风险和负面效果。例如,当我们看到classpath中所指定的类方法存在,还报出NoSuchMethodErrors异常,会令人非常恼火。这是我以前写过众多可以导致NoSuchMethodError问题的其中一个。但是忘记扩展目录下JAR文件中的过时(outdated)和废弃的(obsolete)类是另一个潜在的原因。接下来会展示这一点。

接下来的两段代码展示了Main.java和HelloWorld.java修改后的版本。特别要注意的是,HelloWorld有一个全新的方法,这个
方法会被新版本的Main调用。在这个例子中,我会把新编译的HelloWorld.class文件和Main放在同一个目录下。这样当我运行Main
的时候,就能证明扩展目录下的JAR中过时的类会比当前目录下的新类优先加载。

J2ME  手机应用的开发  JAVA ME

3.1.5 Windows系统的JDK环境

修改后的Hello World.java(新方法)

public class HelloWorld
{
   @Override
   public String toString()
   {
      return "Hello, World!";
   }

   public String directedHello(final String name)
   {
      return "Hello, " + name;
   }
}

SDK  software development kit  软件开发包 函数库或者工具等

3.1.5.1 JDK的安装

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

 澳门新浦京8455com 15

澳门新浦京8455com 16

澳门新浦京8455com 17

 

澳门新浦京8455com 18

澳门新浦京8455com 19

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

修改后的Main.java

import static java.lang.System.out;

public class Main
{
   public static void main(final String[] arguments)
   {
      final HelloWorld helloWorld = new HelloWorld();
      out.println(helloWorld);
      out.println(helloWorld.directedHello("Dustin"));
   }
}

澳门新浦京8455com 20

最后一张截图展示了,扩展目录下过时的HelloWorld类优先于同一目录下的新定义的HelloWorld类加载。甚至当我把当前目录写进
classpath中,扩展目录下的旧版本的类仍然优先。接下来的图也同样展示了扩展目录下的JAR文件“隐藏”了更新的JAR以及其中类的新方法。这些扩展目录下的JAR文件甚至都不是以.jar结尾的。

澳门新浦京8455com 21

刚刚展示的这个例子,在扩展目录下JAR导致的众多问题来说不算很复杂。例子中,至少有一个NoSuchMethodError来提醒这个问
题。一个潜在的更加复杂的情况是,旧的类有和新类一样的方法签名但实现的方式已经过时。在这种情况下,可能没有错误、异常或者throwable中任何一种,但是应用的逻辑不会像预期那样工作。旧的方法可能会一直存在代码的底层直到被发现。当缺乏单元测试或其他测试时尤其如此。

使用扩展目录会让开发人员变得轻松。因为扩展目录下JAR文件中的类,可以被所有运行在与此扩展目录(如果在操作系统上在主机范围内启用扩展目录,那么所有主机上的JRE都可以访问)关联JRE上的应用访问。然而,随意使用扩展目录会有一定的风险。你会非常容易忘记扩展目录下过时的类。这会妨碍类加载器选择明显应当被加载的版本。这种情况下,本来应该让开发者感觉轻松的扩展机制会让他们非常痛苦。

Elliotte Rusty
Harold提对扩展机制有一个警告:“尽管这些看上去很方便,从长远来看也是引入了一个隐患,迟早你会从一个你根本没想过的地方载入一个错误的类版本。这会浪费你不少时间调试”。Java教程同样提出警告(我在这里也着重强调):“尽管这个机制扩展了平台的核心API,但是应该审慎使用。大部分情况,它是用于像JCP这样标准化比较好的接口,同时也适用于整个站点的接口”。

尽管扩展(可选包)机制与classpath机制很像,并且它们都用于部分的类加载,两者之间的区别也是非常值得注意的。特别的,记住所有的在扩展目录下的JAR文件(即使它们没有以.jar结尾)都会被加载是很重要的。给那些JARs重命名甚至改变他们的文件后缀名都不足以让类加载器忽略它们。另一方面,使用classpath的时候,重命名classpath中指定的JAR文件会使该JAR无法加载,改变后缀名后,即使在classpath中使用通配符也无法加载所有目录中的JAR。

一些情况下,扩展机制是比较好的选择,但是这种情况相当少。当处理预期以外的NoSuchMethodErrors问题时,记住扩展机制使很重要的。这样就会去检查看看是否问题就出在扩展的目录中。

JDK  java development kit  是面向开发人员的,java开发工具

3.1.6 配置JDK

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

JRE  java runtime enviroment java运行环境,是面向应用程序使用者的

3.1.6.1 path环境变量配置的作用

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

API application program interface 应用程序编程接口

3.1.6.2 path环境变量配置方式

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

 澳门新浦京8455com 22

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

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

 澳门新浦京8455com 23

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

 澳门新浦京8455com 24

配置环境变量:

3.1.6.3 classpath环境变量配置方式

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

 澳门新浦京8455com 25

CLASSPATH_8_64=.;D:JavaJDKJDK-1.8-64lib;D:JavaJDKJDK-1.8-64libtools.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
jrelib下面的大部分jar 都在这个路径里

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

澳门新浦京8455com 26

javac
XXX.java   实际上就是运行java -calsspath=%JAVA_HOME%libtools.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,因为没有意义,但建议配置,考虑向下兼容的问题。可以参见加深理解。

JAVA_HOME  值放Jdk的地址

3.1.7 总结

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

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

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

PATH  执行命令都从PATH中找  win7是最前面的先找  win10是最下面的先找 
%JAVA_HOME%bin  好处:JAVA_HOME 变了就变了

3.2 第一个Java程序“Hello World”

CLASSPATH 运行java程序的时候查找对应的class

3.2.1 工具介绍

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

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

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

特点:jvm像鞋  Java就是脚  这就是跨平台性  一次编写 到处运行

3.2.2 HelloWorld

源代码

澳门新浦京8455com 27

澳门新浦京8455com 28

class HelloWorld{
  public static void main(String[] args){

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

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

  }
}

澳门新浦京8455com 29

澳门新浦京8455com 30

将源代码存放在K:WorkSpaceJavaJCChapter
1

澳门新浦京8455com 31

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

澳门新浦京8455com 32

此时我们编译程序会发现

澳门新浦京8455com 33

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

澳门新浦京8455com 34

澳门新浦京8455com 35

运行我们编译成功的class

 澳门新浦京8455com 36

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

 澳门新浦京8455com 37

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

 澳门新浦京8455com 38

gc

3.2.3程序解析

澳门新浦京8455com 39

澳门新浦京8455com 40

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");

}

}

澳门新浦京8455com 41

澳门新浦京8455com 42

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

 澳门新浦京8455com 43

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

垃圾回收器:java中有一个线程,专门负责JVM中垃圾内存的释放

3.2.4运行与工作原理

 澳门新浦京8455com 44

垃圾:没有引用的内存节点

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文件

垃圾回收的算法

题外深入知识点

注意:垃圾回收有自己的算法,我们是不能控制垃圾回收机制的,虽然有和垃圾回收相关的方法:java.lang.System.gc() 
java.lang.Runtime.gc(),但是还是无法控制垃圾回收机制

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

  • #### 1 编译器(Compiler )

  • #### 2 解释器

  • #### 3 解释器和编译器的对比

  • #### 4 Javac编译原理

    • ##### 4.1 Javac是什么
  • #### 5 Java你就是比C慢

在chap01下面建一个文件HelloWorld.java

Knowledge Point 20180303 详解main函数

  • #### 一、先说类:

  • #### 二、再说main()方法

  • #### 三、main()方法中可以throw Exception

  • #### 四、main()方法中字符串参数数组作用

  • #### 五、给出HelloWorld的另外一个版本

  • #### 六、解读main

  • #### 总结:

文件内容如下:

public class HelloWorld{

public static void main(String[] args){

System.out.println(“hello world”);

}

}

写完后保存,然后到终端里面编译HelloWorld.java

注意路径:自己的当前位置和HelloWorld.java文件所在的位置是不是一致

javac HelloWorld.java

编译完了之后,会在当前目录下,生成一个文件叫HelloWorld.class

最后我们运行的文件就是这个HelloWorld.class

这样来运行HelloWorld.class文件:

java HelloWorld    注意:运行的时候一定不要加后缀名 .class

这样运行的前提是:XXX.java文件中 没有写包(package)名

编写的java文件要以XXX.java命令

javac XXX.java  (注意当前路径和java文件路径)

XXX.java(源文件)

编译完后会生成一个XXX.class(字节码文件)

运行这个java代码

java XXX    (后面不加.class)

可以把字节码文件打成jar包

jar -cvf hello.jar  HelloWorld.class

类加载:  双亲委托机制

启动类加载

扩展类加载

本地类加载  classpath  Hello.class

JVM

类加载–>字节码验证–>JIT运行

字节码验证:

代码要符合JVM的规范

代码破坏计算机的系统或者硬件

栈不能溢出

方法的参数类型要正确

类型转换要正确

java类名和文件名的关系:

一个java源文件(.java)中,可以有好多个类(class),但是,最多只能有一个类(class)被public修饰

如果有一个类被public修饰,那么这个源文件(.java)的名字就必须和这个被public修饰的类的名字一致,而且还要首字母大写

java文件中的三个顶级元素:

package

1.最终会是以文件夹的形式体现出来(有什么包,就必须有什么文件夹,运行的时候.class文件必须在这个文件夹下面)

2.  .java文件中有多个package的时候,用.分割并且结尾用;号结束
例如:(com.hangsing.test;)

3.包也是java中类的标识的一部分,确定某一个类是通过包名加类名来唯一确定的
比如运行java类的时候:

java package.类名 (java com.hangsing.test.HelloPackage)

import

1.导包用的关键字

2.如果你想在当前这个类使用其他的类,那么就必须通过这个关键字,把那个类导入进来

  1. java.lang包下面的类可以直接使用,不用导入.

  2. 和当前这个类位于同一个包下面的类,也不需要导入,可以直接使用

class

java中标识一个类的关键字

(java类中可以没有package,也可以没有import,但是一定会class)

编写带包名的类 HelloPackage.java

package com.hangsing.test;

public class HelloPackage{

public static void main(String[] args){

System.out.println(“hello world”);

System.out.println(“hello world”);

System.out.print(“hello world”);

}

}

直接编译 javac  HelloPackage.java

然后运行 java HelloPackage  报错!!!

在当前(ch01)目录下面建立文件夹 com/hangsing/test

然后把HelloPackage.class文件剪切到了这个test目录里面

然后在ch01目录下运行:

java com.hangsing.test.HelloPackage

以上建立文件夹并且把.class文件剪切到相应的文件夹里面的操作,我们可以用命令在编译的时候实现

javac -d . HelloPackage.java

-d 表示编译的同时生产和这个.java文件中定义的包名相一致的是文件夹结构,

.  表示在当前目录下生产这个文件夹(这个不一定非是.  也可以是其他路径)

最后编译完成后的.class文件也会自动的放进生产的文件夹里面

然后我们之间用package.类名去运行就可以了

java com.hangsing.test.HelloPackage

注意:没有main方法的类是不能直接运行的

main的形式是固定的(大体是固定,之后会看到改动一些指定地方也是可以的)

public static void main(String[] args){

……

}

因为main方法是程序的入口,要直接运行的那个类,类加载之后,JVM没有在这个类中找个main方法,那么就会报错

JVM只会运行*java命令后面*指定的类中的main方法(如果没有这个方法就报错)

java com.hangsing.test.HelloWorld

Java环境变量配置比较简单,多试试,有着印象即可

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图