- 1995 年初,Sun 公司发布 Java 语言,Sun 公司直接把 Java 放到互联网上,免费给大家使 用,甚至连源代码也不保密,也放在互联网公开。各种各样的小程序层出不穷,Java 终于扬眉吐气,成为了一种广为人知的编程语言。
- 1996 年底,Flash 问世了,这是一种更加简单的动画设计软件:使用 Flash 几乎无须任何编 程语言知识,就可以做出丰富多彩的动画。Flash 逐渐蚕食了 Java 在网页上的应用。
- 1997 年 2 月 18 日,Sun 公司发布了 JDK1.1,增加了即时编译器 JIT。 1995 年 Java 诞生到 1998 年底,Java 语言虽然成为了互联网上广泛使用的编程语言,但它 没有找到一个准确的定位
- 1998 年 12 月,Sun 发布了 Java 历史上最重要的 JDK 版本:JDK1.2。并将 Java 分成了 J2EE (提供了企业应用开发相关的完整解决方案)、J2SE(整个 Java 技术的核心和基础)、J2ME (主要用于控制移动设备和信息家电等有限存储的设备)三个版本。
- 2002 年 2 月,Sun 发布了 JDK 历史上最为成熟的版本,JDK1.4。
- 2004 年 10 月,Sun 发布了万众期待的 JDK1.5。JDK1.5 增加了诸如泛型、增强的 for 语句、 可变数量的形参、注释、自动拆箱和装箱等。
- 2005 年,Java 诞生十周年,J2SE/J2EE/J2ME 分别改名为:JavaSE/JavaEE/JavaME。
- 2006 年 12 月,Sun 发布了 JDK1.6。
- 2007 年 11 月,Google 宣布推出一款基于 Linux 平台的开源手机操作系统:Android。Android 使用 Java 语言来开发应用程序。Android 平台的流行,让 Java 语言获得了在客户端程序上大 展拳脚的机会。
- 2011 年 7 月 28 日,Oracle 发布了 Java SE7,这次版本升级耗时将近 5 年时间。引入二进 制整数、支持字符串的 switch 语句等。
- 2014 年 3 月 18 日,Oracle 发布了 Java SE 8。
- 2017 年 7 月,Oracle 发布了 JavaSE 9。
- 2018 年 3 月 20 日,Oracle 发布了正式版 JavaSE 10。同一年 9 月 25 日发布了 Java11。
- 2019 年 3 月 19 日,Oracle 发布了 Java12。
Java 语言特性
sun 公司对 Java 的描述:"Java is a simple,object-oriented, distributed, interpreted, robust,secure, architecture neutral, portable, high-performance, multihreaded, and dynamic language"。翻译起来就是: “Java 是一门简单的,面向对象,分布式,解释性,健壮的,安全的,结构中立的,便捷的,高性能的,多线程的,动态的语言”。那么,在学习 Java 编程语言之前,让我们一起来看一看它有哪些特性吧?
- ① 简单性:Java 语言底层采用 C++语言实现,相对于 C++来说,Java 是简单的,在 Java语言中程序员不需要再操作复杂的指针(指针的操作是很复杂的),继承方面也是只支持单继承(C++语言是一种半面向对象的编程语言,支持多继承,多继承会导致关系很复杂),在很多方面进行了简化。
- ② 面向对象:Java 中提供了封装、继承、多态等面向对象的机制。
- ③ 健壮性:在 C++程序当中的无用数据/垃圾数据需要编程人员手动释放,当忘记释放内存的时候,会导致内存使用率降低,影响程序的执行;在Java 语言当中这种问题得到了解决,因为 Java 语言引入了自动垃圾回收机制(GC 机制),Java 程序启动了一个单独的垃圾回收线程,时刻监测内存使用情况,在特定时机会回收/释放垃圾数据,这样会让内存时刻处于最好的状态。
- ④ 多线程:Java 语言支持多个线程同时并发执行,同时也提供了多线程环境下的安全机制。
- ⑤ 可移植性/跨平台:可移植性/跨平台表示 Java 语言只需要编写/编译一次,即可处处运行。Java 代码既可以运行在 windows 的环境下,又可以运行在 Linux 的环境下,而不需要修改Java 源程序,那么它是怎么做到的呢?功劳全在于“Java 虚拟机(Java Virtual Machine,简称JVM)”这种机制,实际上 Java 程序运行的时候并不是直接运行在操作系统上面的,而是在操作系统上先安装了一个 JVM,把 Java 程序放到了 JVM 当中运行,JVM 屏蔽了各操作系统之间的差异,这样就完成了跨平台。但是,JVM 的出现虽然搞定了跨平台,同时也带来了一些问题,比如要想运行 Java 程序就必须先安装 JVM,没有 JVM,Java 程序是运行不了的,就像你要在网页上看视频,结果浏览器却提示你需要安装 Flash 插件,这一点你是不是感觉非常不爽呀!那么 Java 程序、Java 虚拟机、操作系统之间是怎样的关系呢?请看下图:
JDK、JRE、JVM三者之间的关系?
在学习 Java 之前,我们需要对一些专业术语有一定的了解,在 Java 中常见的专业术语包括:JDK、JRE、JVM 等,它们分别是什么,它们之间的关系又是怎样的呢,请看下图:
从上图中我们可以看到,JDK、JRE、JVM 之间存在这样的包含关系:JDK包含 JRE,JRE又包含 JVM。换句话说,只要安装了 JDK,JRE 和 JVM 则自动就安装了。那么它们分别代表什么呢:
- ① JDK:JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK)。它是每一个 Java 软件开发人员必须安装的。JDK 安装之后,它会自带一个 JRE,因为软件开发人员编写完代码之后总是要运行的。注意:如果只是在这台机器上运行 Java 程序,则不需要安装 JDK,只需要安装 JRE 即可(JRE 是有独立安装包的,这个大家可以从 Oracle 官网上找一下)。
- ② JRE:JRE(Java Runtime Environment,Java 运行环境),运行 JAVA程序所必须的环境的集合,包含 JVM 标准实现及 Java 核心类库。
- ③ JVM:JVM 是 Java Virtual Machine(Java 虚拟机)的缩写,JVM 是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM 是实现 Java 语言跨平台的法宝。在这里我需要重点强调一下,不同的操作系统需要安装不同版本的 JDK,有专门的 windows版 JDK,Linux 版 JDK,Mac 版 JDK 等,当然不同版本的 JDK安装之后会对应不同版本的 JRE和 JVM。
JDK 的下载与安装
- 进入官网下载需要安装的JDK版本,傻瓜式安装,下一步即可。具体操作流程,参看百度。
- 建议:安装路径不要有中文或者空格等特殊符号。
- 如果操作系统是64位的,软件尽量选择支持64位的(除非软件本身不区分)。
- JDK13安装的时候内置了一个JRE,独立于JDK之外的JRE并没有生成。对于java13来说,如果你希望生成一个独立于JDK之外的JRE的话需要执行特殊的命令。
- JDK8安装的时候,不仅JDK内置了一个JRE,而且还会在JDK目录之外独立的生成一个单独的JRE。(以前低版本的时候,JRE实际上是有2个。)一个是JDK内置的,一个是独立于JDK之外的。
JDK的安装目录介绍
配置环境变量 path
- 为了开发方便,我们想在任意的目录下都可以使用JDK的开发工具,则必须要配置环境变量,配置环境变量的意义 在于告诉操作系统,我们使用的JDK开发工具在哪个目录下。具体操作流程,参看百度。
到目前为止,大家告诉我,一共配置了哪些环境变量?
到目前为止,我们只配置了一个环境变量path,并且这个环境变量path和java实际上没关系,是人家windows操作系统的机制。对于Java的JDK所属的环境变量,有一个叫做:JAVA_HOME。这个JAVA_HOME目前我们不需要,不配置这个环境变量也不会影响当前java程序的运行。但是后期学习到JavaWEB的时候需要安装Tomcat服务器,那个时候JAVA_HOME就必须配置了。那么除了JAVA_HOME环境变量之外,JDK相关的环境变量还有其他的吗?
答案:有的。
Java的加载与执行过程
在编写第一个 Java 程序之前,我们应当对 Java 的加载与执行提前有一个简单的了解,java程序从编写到最终运行经历了哪些过程?请看下图:
通过上图,我们可以看到 Java 程序从开发到最终运行是这样进行的:
- 第一步(写代码):在任意位置创建一个.java 结尾的文件,程序员在该文件中编写符合 Java语法的源代码,这个文件被称为Java 源文件。
- 第二步(编译):使用“javac”命令对 java 源文件进行编译,如果 Java 源文件符合 Java语法规则,则编译生成 1 个或者多个以“.class”结尾的文件。“.class”结尾的文件我们称之为字节码文件,注意字节码文件不是普通文本文件,使用记事本等文本编辑器是无法打开的,但该文件内容也不是二进制,如果是二进制形式的话,操作系统是可以直接执行的,这个文件的内容我们称之为字节码。注意:这里有一个“类名”的概念,假设生成的文件是 A.class,则表示类名为 A,B.class 则表示类名为 B。
- 第三步(运行):使用“java”命令运行已编译的 Java 程序,假设编译之后的字节码文件是 A.class,则在 dos 命令窗口中执行 java A命令,这个时候 Java 虚拟机(JVM)就启动了,Java 虚拟机通过“类装载器 ClassLoader”从硬盘中找到 A.class 文件并装载,字节码文件被装载到 Java 虚拟机之后,Java 虚拟机解释器对字节码进行解释,最终解释为二进制码,然后操作系统通过执行二进制指令来和硬件平台完成交互。
以上则是 Java 程序加载与执行的过程,接下来我给大家总结 7 条规则,大家可以理解并记忆一下:
- ① Java 程序从开发到运行包括编译和运行两个阶段,这两个阶段可以在不同的操作系统中完成,例如在 windows 环境下进行编译,在 Linux 环境下运行,这是因为有 JVM 机制的存在,做到了一次编译到处运行(跨平台/可移植)。
- ② 编译阶段需要使用 javac.exe(安装 JDK 之后该命令就存在了)命令,运行阶段需要使用 java.exe(安装 JRE 之后该命令就存在了)命令。
- ③ 一个 Java 源文件可能会编译生成多个 class 文件。
- ④ Java 源文件中的源代码如果不符合 Java 的语法机制则编译时编译器会提示错误信息,并且无法生成 class 文件。反之则生成 class 文件,而 class 文件才是最终要执行的程序,此时将 Java 源文件删除是不会影响 Java 程序运行的(当然,我们也不必删除 java 源文件,因为在运行 class 文件之后,如果没有达到预期的运行效果,这个时候还需要将 Java 源代码修改,重新编译,以达到最终的运行效果)。
- ⑤ 若生成的字节码文件名为 A.class,那么我们称 A为一个类的名字
- ⑥ 当编译阶段完成之后,我们可以使用 JRE 中的 java.exe 命令运行程序,例如执行命令“java A”,该命令执行后会启动类加载器,类加载器去硬盘上搜索 A.class 文件,找到该字节码文件之后,将其加载到 JVM 当中,JVM 中的解释器会将 A.class 字节码文件解释为操作系统可以执行的二进制码,然后操作系统通过执行二进制码和硬件平台交互。
- ⑦ 运行 Java 程序的前提是当前操作系统上已经安装了对应版本的 JVM(JVM 不是单独安装的,安装 JRE 即可,不同的操作系统需要安装不同版本的 JRE,不同版本的 JRE 对应不同版本的 JVM)。
问题:字节码文件是二进制文件吗?字节码文件不是二进制文件。如果是二进制的话,就不需要JVM了。因为操作系统可以直接执行二进制。
HelloWorld入门程序
开发环境已经搭建完毕,可以开发我们第一个Java程序了。 Java程序开发三步骤:编写、编译、运行。
1:编写Java源程序
新建文本文件,完整的文件名修改为 HelloWorld.java ,其中文件名为 HelloWorld ,后缀名必须为 .java 。用记事本打开,在文件中键入文本并保存,代码如下
public class HelloWorld {
public static void main(String[] args) {
System.out.println("hello world!!");
}
}
第一个 HelloWord 源程序就编写完成了,但是这个文件是程序员编写的,JVM是看不懂的,也就不能运行,因此我 们必须将编写好的 Java源文件 编译成JVM可以看懂的 字节码文件 。
2:编译Java源文件
在DOS命令行中,进入Java源文件的目录,使用 javac 命令进行编译。
编译成功后,命令行没有任何提示。源文件的目录,发现产生了一个新的文件 HelloWorld.class ,该文件就是编译后的文件,是Java的可运行文件,称为字节码文件,有了字节码文件,就可以运行程序了。
3:运行Java程序
在DOS命令行中,进入Java源文件的目录,使用 java 命令进行运行。
我们一起来研究一下:“java HelloWorld”的执行过程以及原理。
- 先启动JVM(java虚拟机)
- JVM启动之后,JVM会去启动“类加载器classloader” 类加载器的作用:加载类的。本质上类加载器负责去硬盘上找“类”对应的“字节码”文件。
- 默认情况下类加载器(classloader)会从当前路径下找(解释了为什么要进入class字节码文件所在的目录下)
- 我们可以设置一个环境变量classpath,叫做:classpath给类加载器指定一个路径,让类加载器去指定的路径下加载字节码文件。
- classpath是一个环境变量,是给谁指路的?是给“类加载器”指路的。
- classpath环境变量不属于windows操作系统,classpath环境变量隶属于java。classpath环境变量是java特有的。
- 在环境变量中配置classpath,变量名不能随意写:大小写无所谓,但必须叫做:classpath(计算机-->右键-->属性-->高级系统设置-->环境变量-->新建...)例如:classpath=D:\course,配置了classpath=D:\course之后,类加载器只会去D:\course目录下找“xxx.class”文件不再从当前路径下找了。
3.类加载器如果在硬盘上找不到对应的字节码文件,会报错,报什么错?错误: 找不到或无法加载主类类加载器如果在硬盘上找到了对应的字节码文件,类加载器会将该字节码文件装载到JVM当中,JVM启动“解释器”将字节码解释为“101010000...”这种二进制码,操作系统执行二进制码和硬件交互。
总结:
学习编程最容易犯的错是语法错误。Java要求你必须按照语法规则编写代码。 如果你的程序违反了语法规则,例如:忘记了分号、大括号、引号,或者拼 错了单词,java编译器都会报语法错误。尝试着去看懂编译器会报告的错误信。
入门程序说明
编译和运行是两回事
- 编译:是指将我们编写的Java源文件翻译成JVM认识的class文件,在这个过程中, javac 编译器会检查我们 所写的程序是否有错误,有错误就会提示出来,如果没有错误就会编译成功。
- 运行:是指将 class文件 交给JVM去运行,此时JVM就会去执行我们编写的程序了。
关于main方法
- main方法:称为主方法。写法是固定格式不可以更改。main方法是程序的入口点或起始点,无论我们编写多少程序,JVM在运行的时候,都会从main方法这里开始执行。
Java 中的注释
作用:
注释是对代码的解释和说明,其目的是让程序员能够更加快速的理解代码。它是编写程序时,写程序的人给一个语句、程序段等的解释或提示,能提高程序代码的可读性。我认为添加注释,是为了程序更容易理解与维护,特别是维护,更是对自己代码负责的一种体现。注释在编译的时候不会生成到 class 字节码文件当中,它只在 java 源文件中保留。
第一种:单行注释,语法格式如下:
/*
* 这里的注释信息为多行注释:
* 第 1 行注释信息
* 第 2 行注释信息
*/
/**
* 这里的信息是 javadoc 注释
* @author 作者名字
* @version 版本号
* @since 自从哪个版本号开始就存在了
*/
注意:
- 对于 javadoc 注释来说,这里的注释会被 JDK bin 目录下的 javadoc.exe 命令解析并生成帮助文档(生成帮助文档后期做项目的时候大家会接触到的)。
注释注意事项:
- 对于单行和多行注释,被注释的文字,不会被JVM(java虚拟机)解释执行。
- 多行注释里面不允许有多行注释嵌套
- 文档注释内容可以被JDK提供的工具 javadoc 所解析,生成一套以网页文件形式体现的该程序的说明文档。
???????注释使用,代码演示
/*
1、什么是注释,有什么用?
注释是对java源代码的解释说明。
注释可以帮程序员更好的理解程序。
2、注释信息只保存在java源文件当中,java源文件编译生成的字节码class文件,
这个class文件中是没有这些注释信息的。
3、在实际的开发中,一般项目组都要求积极的编写注释。这也是一个java软件工程师
的基本素养。
4、注释不是写的越多越好,精简,主线清晰,每个注释都应该是点睛之笔。(以后慢慢锻炼)
*/
// 这种注释属于单行注释,只注释两个斜杠后面的
/**
* 类的注释信息
*
* @author bjpowernode-dujubin
* ....
* @version 1.0
*/
public class HelloWorld { // 这是一个类,类名叫做HelloWorld
public static void main(String[] args) {
System.out.println("Hello World");
System.out.println("动力节点-口口相传的Java黄埔军校");
}
}
/*
在这里可以编写多行注释
这是一行注释
这是第二行注释
这是第三行注释
*/
小结第一个程序
- Java源文件以“java”为扩展名。源文件的基本组成部分是类(class),如 本例中的HelloWorld类。
- Java应用程序的执行入口是main()方法。它有固定的书写格式: public static void main(String[] args) {...}。没有main方法的类可以编译通过,却无法运行。
- Java语言严格区分大小写。
- Java方法由一条条语句构成,每个语句以英文状态下的“;”结束。
- 大括号都是成对出现的,缺一不可。
- 一个源文件中最多只能有一个public类。其它类的个数不限,如果源文件包含 一个public类,则文件名必须按该类名命名。
- 非常非常重要的是:方法体中的代码遵循自上而下的顺序依次逐行执行。
- 在java中任何有效的代码必须写到“类体”当中,最外层必须是一个类的定义。
- 类名后面必须是一对大括号,这一对大括号被称为“类体”
小知识:
public class Test4{
// 注意:args可以改名字,随意,对于主方法来说只有这个位置可以改,其它位置不能动
public static void main(String[] fdsafdsafdsafdsa){
System.out.println("hello world");
}
}
public class 和 class 的区别
- 如果定义 public class 的类,只能定义一个,并且要求此类名必须和 java 源文件名保持一致。
- 一个 java 源文件中可以定义多个 class,并且在编译的时候一个 class 会对应编译生成一个 class 字节码文件。
- public 的 class 可以没有定义。源文件名字可以随意定义。
- 任何一个 class 中都可以设定程序入口,也就是说任何一个 class中都可以写 main 方法(主方法),想从哪个入口进去执行,则让类加载器先加载对应的类即可
- 在实际的开发中,虽然一个 java 源文件可以定义多个 class,实际上这是不规范的,比较规范的写法是一个 java 源文件中只定义一个 class。