导航
1.Java是什么
2.Java能干什么
3.Java的历史
4.Java版本的演变
5.Java开发环境的搭建/JDK的下载和安装
6.JDK,JRE,JVM
7.如何理解Java跨平台?
8.Java程序的编写、编译、运行
9.Java程序是如何执行的?
10.如何理解Java平台?
11.环境变量
12.Applet
13.注释
14.关键字
15.标识符
1.Java是什么
Java是一门完全面向对象的编程语言,简单易用,功能强大。由Sun公司(Sun Microsystems)于1995年发布,2009年Sun公司被Oracle公司收购,所以现在Java的版权是Oracle的。
2.Java能干什么
Java提供了三种平台Java SE ,Java ME ,Java EE ,分别用于开发桌面应用,嵌入式应用,企业级应用。其中Java在Java EE的表现十分抢眼,各种银行、*系统大多采用Java EE平台构建。
JavaSE ( Java Platform Standard Edition)
Java标准版,主要用于编写桌面应用。JavaSE是三个平台中最核心的部分,JavaME和JavaEE都是在JavaSE的基础上发展而来。JavaSE平台中包括了Java最核心的类库,如集合、IO、数据库连接以及网络编程等。
JavaME( Java Platform Micro Edition)
Java移动版,主要用于编写嵌入式应用
JavaEE( Java Platform Enterprise Edition)
Java企业版,主要用于分布式的网络程序的开发,是为开发企业级应用程序提供的解决方案。该平台用于开发、装配以及部署企业级应用程序,其中主要包括 Servlet、JSP、 Javabean、JDBC、EJB、Web等技术。
Java EE应用领域有:
- 互联网:电商、P2P(电子金融、商务金融)等等;
- 企业级应用:ERP(企业资源计划)、CRM(客户关系管理)、BOS、OA(办公自动化)等等。
3.Java的历史
Java的诞生可以说是一个巧合。1990年末,硬件领域出现了单片式计算机系统,Sun公司(Stanford University Network,斯坦福大学校园网的首字母缩写)成立了一个由James Gosling(Java之父)领导的“Green 计划”,准备为下一代智能家电(如电视机、微波炉、电话)编写一个通用控制系统。
该团队最初考虑C++,但是由于C++太过复杂,以及单片式系统硬件资源极其匮乏而放弃。于是他们假定了一种硬件平台,在这个假定的硬件平台上开发了一种新的语言Oak。
但是语言开发成功后,没有生产商愿意开发和生产这种硬件平台。于是Oak就被搁置下来。
之后随着互联网的兴起,他们决定把Oak应用于网络上。作为原型,帕特里克·诺顿写了一个小型万维网浏览器WebRunner(就是后来的HotJava浏览器)。
(HotJava浏览器是用Java语言编写的,能够在网页中执行Applet。不过,HotJava虽可执行Java Applet程序,但真正用于一般网页浏览的效果及支援并不佳,Sun公司为了让各种浏览器都可以执行Java Applet,所以也推出Java插件, 安装此软件即可让多数的网页浏览器也能执行Java Applet。因此,既然许多网页浏览器也能执行Java Applet,以致HotJava几乎只有Java Applet编程语言的初学者用来练习撰写程序的效果验证之用,并未获得进一步普及,此后到了 1999年Sun公司方面也宣布停止此套HotJava的后续发展,停终前的最后一版即是HotJava 3.0)
Sun公司首先推出了可以嵌入网页并且可以随同网页在网络上传输的Applet(Applet是一种将小程序嵌入到网页中进行执行的技术),并将Oak更名为Java(在申请注册商标时,发现Oak已经被人使用了,于是使用了印尼爪哇咖啡的Java)。之后Sun公司在Sun world会议上正式发布Java和HotJava浏览器。IBM、Apple、DEC、Adobe、HP、Oracle、Netscape和微软等各大公司都纷纷停止了自己的相关开发项目,竞相购买了Java使用许可证,并为自己的产品开发了相应的Java平台。
1995年,Sun虽然推出了Java,但这只是一种语言,如果想开发更复杂的应用程序,必须要有一个强大的开发类库。因此,Sun在1996年1月发布了JDK1.0。这个版本包括两个部分:运行环境JRE和开发环境JDK。
10月,Sun公司发布了Java平台的第一个即时(JIT)编译器。
1997年2月,发布了JDK1.1。JDK1.1增加了JIT(即时)编译器。
JIT和传统的编译器不同,传统的编译器是编译一条,运行完后将其扔掉;而JIT会将经常用到的指令保存在内存中,当下次调用时就不需要重新编译了,通过这种方式让JDK在效率上有了较大提升。
但一直以来,Java主要的应用就是网页上的Applet以及一些移动设备。到了1996年年底,Flash面世了,这是一种更加简单的动画设计软件:使用Flash几乎无序任何编程语言知识,就可以做出丰富多彩的动画。随后Flash增加了ActionScript编程脚本,Flash逐渐蚕食了Java在网页上的应用。
从1995年Java的诞生到1998年年底,Java语言虽然成为了互联网上广泛使用的编程语言,但它并没有找到一个准确的定位,也没有找到它必须存在的理由:Java语言可以编写Applet,而Flash一样可以做到,而且更快,开发成本更低。
直到1998年12月,Sun发布了Java历史上最重要的JDK版本:JDK1.2,伴随JDK1.2一同发布的还有JSP/Servlet、EJB等规范,并将Java分成了J2EE、J2SE和J2ME三个版本。
这标志着Java已经吹响了向企业、桌面和移动三个领域进军的号角,标志着Java已经进入Java2时代,这个时期也是Java飞速法阵的时期。
在Java2中,Java发生了很多革命性的变化,而这些革命性的变化一直沿用到现在,对Java的发展形成了深远的影响。直到今天还经常看到J2EE、J2SE等名称。
1999年4月27日,HotSpot虚拟机发布。HotSpot 虚拟机发布时是作为JDK 1.2的附加程序提供的,后来它成为了JDK 1.3及之后所有版本的Sun JDK的默认虚拟机。
2002年2月,Sun发布了JDK历史上最为成熟的版本:JDK1.4。JDK1.4已经可以使用Java实现大多数的应用了。
在此期间,Java语言在企业应用领域大放异彩,涌现出大量基于Java语言的开源框架:Struts、WebWork、Hibernate、Spring等;大量企业应用服务器也开始涌现:WebLogic、WebSphere、JBoss等,这些都标志着Java语言进入了飞速发展时期。
2004年10月,Sun发布了JDK1.5,同时,Sun将JDK1.5改名为Java SE 5.0,J2EE、J2ME也相应地改名为Java EE和Java ME。
JDK1.5增加了诸如泛型、增强的for语句、可变数量的形参、注释(Annotations)、自动拆箱和装箱等功能;同时,也发布了新的企业级平台规范,如通过注释等新特性来简化EJB的复杂性,并推出了EJB3.0规范。还推出了自己的MVC框架规范:JSF,JSF规范类似于ASP.NET的服务器端空间,通过它可以快速地构建复杂的JSP界面。
2006年12月,Sun公司发布了JDK 1.6(也被称作Java SE 6)。
2009年,Oracle收购Sun,获得了Java和Solaris的产权。
2007年11月,Google宣布退出一款基于Linux平台的开源手机操作系统:Android。Android 平台使用了 Dalvik 虚拟机来运行 .dex文件,Dalvik 虚拟机的作用类似于JVM虚拟机,只是它并未遵守JVM规范而已。Android使用Java语言来开发应用程序,这也给了Java语言一个新的机会。在过去的岁月中,Java语言作为服务器端编程语言,已经取得了极大的成功;而 Android 平台的流行,则让 Java 语言获得了在客户端程序上大展拳脚的机会。
2011年7月28日,Oracle发布了Java SE 7,引入了二进制整数、支持字符串的switch语句、菱形语法、多异常捕捉、自动关闭资源的try语句等新特性。
2014年3月18日,Oracle发布了Java SE 8,引入了全新的Lambda表达式、流式编程等大量新特性。
2017年9月22日,Oracle发布了Java SE 9,这次版本升级强化了Java的模块化系统,让庞大的Java语言更轻量化,而且采用了更高效、更智能的G1垃圾回收器,并在核心类库上进行了大量更新,可以进一步简化编程;但对语法本身更新并不多(毕竟Java语言已经足够成熟)。
4.Java版本的演变
虽然Java的实际版本是从1.1推进到1.2,但因变化幅度大,所以销售部门决定用全新的命名,于是命名为Java 2。Java 3或4从来都没有出现过,到了1.5版时,销售部门又认为进步幅度太大(大部分的程序员都同意这么说)而需要全新的名称,所以又冒出一个Java5.0,用5对应到1.5。
最开始的Java版本是Java 1.02(第一次出版的版本),1.02到1.1版都算是"Java"。1.2、1.3和1.4版都叫做"Java 2"。从1.5版开始叫做"Java 5.0",也叫做"Tiger"(开发代号)。
-
-
JDK 1.1.5 Pumpkin 南瓜 1997-12-13
-
JDK 1.1.6 Abigail 阿比盖尔--女子名 1998-04-24
-
JDK 1.1.7 Brutus 布鲁图--古罗马政治家和将军 1998-09-28
-
JDK 1.1.8 Chelsea 切尔西--城市名 1999-04-08
-
J2SE 1.2 Playground 运动场 1998-12-04
-
J2SE 1.2.1 none 无 1999-03-30
-
J2SE 1.2.2 Cricket 蟋蟀 1999-07-08
-
J2SE 1.3 Kestrel 美洲红隼(sǔn) 2000-05-08
-
J2SE 1.3.1 Ladybird 瓢虫 2001-05-17
-
J2SE 1.4.0 Merlin 灰背隼 2002-02-13
-
J2SE 1.4.1 grasshopper 蚱蜢 2002-09-16
-
J2SE 1.4.2 Mantis 螳螂 2003-06-26
-
JAVASE 5.0 (1.5.0) Tiger 老虎
-
JAVASE 5.1 (1.5.1) Dragonfly 蜻蜓
-
JAVASE 6.0 (1.6.0) Mustang 野马
-
JAVASE 7.0 (1.7.0) Dolphin 海豚
5.Java开发环境的搭建/JDK的下载和安装
要想开发一个Java程序,首先需要安装Java开发环境JDK(JavaSE Development Kit)
为什么需要安装JDK呢?C语言安装一个编译器不是就可以了吗?
任何一个程序编写完成后,要想执行最终都要转换为计算机可以理解的二进制
因为C语言是编译语言,C源文件经过编译器编译后就可以生成二进制指令,操作系统就可以执行了。故只需要编译器即可
而Java是半编译,半解释的语言,编译生成的class文件最终是要在JVM虚拟机里面执行的,JDK里面就包含了编译运行Java程序所需要的全部东西(包括开发类库,Java运行环境,类加载器等很多东西)
进入oracle的官网 https://www.oracle.com/ 就可以下载Java
安装时不需要安装公共JRE(即额外安装的JRE),因为JDK里面包含JRE
安装的JDK源代码是名为src.zip的压缩包,不同的JDK安装的位置可能不同,如JDK8是将其安装在JDK安装目录下,JDK9是将其安装在安装目录的lib目录下
检验jdk是否安装成功,在JDK安装目录的bin目录下打开cmd窗口,运行javac命令,java命令,若无异常则表示安装成功
也并不是一定要安装JDK。
使用eclipse开发的话需要安装相应版本的JRE,因为eclipse是由Java语言编写的,其运行依赖于JRE。eclipse内置有JDK和JRE。
使用myeclise开发JDK及JRE都不需要安装,其均有内置。
只不过一般使用自己安装版本的JDK。
6.JDK,JRE,JVM
JDK:
Java SE Development Kit, Java标准版开发工具包
包括了Java运行环境,一些Java工具(javac、java、jps等)和Java的核心类库(Java API)
主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如,IBM公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK
JRE:
Java Runtime Environment, Java运行时环境
可以把Java API类库中的Java SE API子集和Java虚拟机这两部分统称为JRE
运行Java软件只安装JRE即可,安装时系统会自动添加环境变量,配置注册表等
JDK6、JDK7是在安装JRE的时候,在C:Windows\System32目录下生成了java.exe、javaw.exe、javaws.exe三个文件
JDK8是在C:\Program Files (x86)\Common Files\Oracle\Java\javapath 路径下生成了java.exe、javaw.exe、javaws.exe三个文件,并将该路径添加到了PATH环境变量中
安装JDK时会在注册表中设置JRE当前版本,所以如果安装了多个JRE,可能会出现Error: Registry key ‘Software\JavaSoft\Java Runtime Environment’\CurrentVersion’这个错误
需要在注册表“计算机\HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\CurrentVersion”路径下右键更改JRE版本
JVM:
Java Virtual Machine,是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
JVM负责运行字节码,把每一条要执行的字节码交给解释器,翻译成对应的机器码,然后由解释器执行。
JVM解释执行字节码文件就是JVM操作Java解释器进行解释执行字节码文件的过程。
Java解释器是JVM的一部分,java.exe可以简单看成是Java解释器。
在JDK和JRE的安装目录下,bin\server\目录下有一个 jvm.dll 文件,这就是JVM。
JDK包含JRE,JRE包含JVM。(在JDK9以前,比如JDK8在JDK的安装目录下有一个jre文件夹,和单独安装的JRE基本一致但并不完全相同)
7.如何理解Java跨平台?
平台,我们可以简单的理解为操作系统。(实际上平台是指CPU处理器与操作系统的整体。不同的操作系统支持不同的CPU指令集)
跨平台指的是源程序编译后生成的字节码文件跨平台
如C语言不是跨平台的语言。一个C语言源文件编写好后,编译时,在windows系统有windows系统对应的编译器(如VS),linux系统有linux系统的编译器(如gcc),在不同系统编译生成的文件是不一样的,windows下编译产生的文件不能放到Linux环境去执行。
而Java是一门可以跨平台的语言,编译后生成的class文件不需要经过任何修改就能在各个平台上运行。实现这个特性依赖的是不同平台上的JVM。
在不同的操作系统上需要安装不同的jdk,也就有了不同的JVM,JVM能够将一个字节码文件转换为CPU认识的机器码。
而我们平时说的write-once/run-anywhere是当初Java的宣传语,指的是一次编写到处运行。
像C/C++,是面向操作系统编程的,编程时需要开发者极大地关心不同操作系统之间的差异性。这意味着,如果你想在另一个操作系统上执行相同的功能,很有可能要把源代码大改一通。
而因为Java利用了JVM屏蔽了底层操作系统细节,使得程序员编写代码时不必过分去考虑操作系统之间的不同,只要编写一次就OK了。
8.Java程序的编写、编译、运行
1.Java程序的编写
使用纯文本编辑器编写一个Java源文件,其名称为HelloWorld.java。注意Java语言严格区分大小写。
1 public class HelloWorld { 2 public static void main(String[] args) { 3 System.out.println("HelloWorld"); 4 } 5 }
注意:
1.一个Java源文件可以包含多个类,但最多只能包含一个被public修饰的类
2.Java源文件中若含有被public修饰的类,则源文件的名称必须和被public修饰的类的名称相同
(即若源文件中没有被public修饰的类,则源文件名称没有特定要求,符合命名规范即可,但一般情况下我们仍然使用类名作为源文件名)
2.Java程序的编译
编译操作需要使用编译器来完成,即JDK安装目录下的bin目录下的javac.exe
格式:javac命令完整路径 java源文件
如:D:\develop\Java\jdk-9\bin\javac D:\java\HelloWorld.java
编译成功时,控制台上不会有输出。而且会在源文件所在目录下生成字节码文件,字节码文件的扩展名为.class。
编译失败会在控制台上输出错误信息,不会生成字节码文件。
3.Java程序的运行
运行Java程序需要使用java.exe命令,它与javac.exe在同一目录下。
格式:java命令完整路径 类名
如:D:\develop\Java\jdk-9\bin\java HelloWorld
java命令可以写出全路径,但类名这里就只能写类的名字,不能写class文件的全路径,也不能写出“.class”,因为第二个参数只能是类名如HelloWorld,否则会报错“找不到或无法加载主类”。
那程序怎么知道到哪里去找这个类呢?这时就用到了CLASSPATH这个环境变量。
9.Java程序是如何执行的?
首先Java源代码经过编译器编译生成与平台无关的字节码文件。在运行时,JVM会通过类加载器(Class-Loader)加载字节码,解释或者编译执行。常见的JVM如Oracle JDK提供的Hotspot JVM,都提供了JIT(Just-In-Time)即时编译器,JIT能够在运行时将热点代码编译成机器码,这种情况下部分热点代码就属于编译执行,而不是解释执行了。JDK 8实际是解释和编译混合的一种模式,即所谓的混合模式(-Xmixed)。通常运行在 server模式的 JVM,会进行上万次调用以收集足够的信息进行高效的编译,client模式这个门限是 1500次。Oracle Hotspot JVM内置了两个不同的 JIT compiler,C1对应前面说的 client模式,适用于对于启动速度敏感的应用,比如普通 Java桌面应用;C2对应 server模式,它的优化是为长时间运行的服务器端应用设计的。默认是采用所谓的分层编译(TieredCompilation)。
Java虚拟机启动时,可以指定不同的参数对运行模式进行选择。 比如,指定“-Xint”,就是告诉 JVM只进行解释执行,不对代码进行编译,这种模式抛弃了 JIT可能带来的性能优势。毕竟解释器(interpreter)是逐条读入,逐条解释运行的。与其相对应的,还有一个“-Xcomp”参数,这是告诉 JVM关闭解释器,不要进行解释执行,或者叫作最大优化级别。那你可能会问这种模式是不是最高效啊?简单说,还真未必。“-Xcomp”会导致 JVM启动变慢非常多,同时有些 JIT编译器优化方式,比如分支预测,如果不进行 profiling,往往并不能进行有效优化。
除了我们日常最常见的 Java使用模式,其实还有一种新的编译方式,即所谓的 AOT(Ahead-of-Time Compilation),直接将字节码编译成机器代码,这样就避免了 JIT预热等各方面的开销,比如 Oracle JDK 9就引入了实验性的 AOT特性。
10.如何理解Java平台?
Java平台即由Java编程语言所撰写的软件赖以运行的平台。(Java执行环境本身就是一个平台)
Java平台的体系包括了以下几个重要组成部分:
- Java程序设计语言
- 各种硬件平台上的Java虚拟机
- Class文件格式
- Java API类库及相关工具
- 来自商业机构和开源社区第三方Java类库
11.环境变量
1.PATH环境变量的作用
指定命令的寻找路径。如执行 javac 命令,那么Windows系统会首先在当前路径寻找,如果当前路径没有找到该命令,则会到PATH变量中去寻找。
2.PATH环境变量的配置
鼠标右键点击计算机 → 属性 → 高级系统设置 → 点击环境变量 → 找到系统变量中的PATH → 点击编辑按钮。
将JDK安装目录\bin路径配置到PATH变量中,win7系统的话需要用英文分号与其他变量隔开。
一般情况下是新增一个系统变量 JAVA_HOME ,将JDK安装路径配置到JAVA_HOME系统变量中,再把 "%JAVA_HOME%\bin"配置到PATH环境变量中
3.必须要配置PATH环境变量吗?
其实如果不用记事本写代码,cmd窗口编译执行的话,基本上是不需要配置环境变量的
用eclipse开发需安装相应版本的jre,是因为eclipse是用Java语言编写的,软件的运行需要本地有jre
eclipse和myEclipse均内置有多种jdk和jre
4.环境变量配置为什么要配置JAVA_HOME?
因为有一些软件如tomcat启动时会去寻找该环境变量。而且配置了JAVA_HOME之后,eclipse也能够自己找到本地jjdk了
5.需要配置CLASS_PATH环境变量吗?
如果使用1.5以上版本的JDK,完全可以不用设置CLASSPATH环境变量。
此环境变量的作用是,当运行一个Java程序时,告诉jJVM到哪里去找某个类。
如果使用1.4以前版本的JDK,则需要在CLASSPATH环境变量中添加点(.),用以告诉JRE需要在当前路径下搜索Java类。(因为1.4以前版本的JDK没有设计在当前路径下寻找类的功能)
除此之外,编译和运行Java程序还需要JDK的lib目录下dt.jar和tools.jar文件中的Java类,因此还需要把这两个文件添加到CLASSPATH环境变量里。
(javac命令其实只是个摆设,它是调用了tools.jar里面的类去编译源文件的。我们可以把lib目录下的tools.jar重命名为tools1.jar,再使用javac命令编译源文件时,就会报错“找不到或无法加载主类 com.sun.tools.javac.Main”)
JDK9 的lib目录已经不再包含 dt.jar 和 tools.jar 文件。
因此,如果使用1.4以前版本的JDK来编译和运行Java程序,常常需要设置CLASSPATH环境变量的值为 .;%JAVA_HOME%\lib]dt.jar;%JAVA_HOME%\lib\tools.jar
当然,即使使用JDK 1.5 以上版本的JDK,也可以设置CLASSPATH环境变量(通常用于加载第三方类库),一旦设置了该环境变量,JRE将会按该环境变量指定的路径来搜索Java类。这意味着如果CLASSPATH环境变脸中不包括点(.),也就是没有包含当前路径,JRE不会在当前路径下搜索Java类。
即,如果要设置CLASSPATH环境变量,一定要把JRE原来寻找Java类的路径设置上。
如果想在运行Java程序时临时指定JRE搜索Java类的路径,则可以使用 -classpath 选项(或用 -cp 选项, -cp 是简写,作用完全相同),即按如下格式来运行java命令:
java -classpath dir1;dir2;dir3...;dirN Java类
-classpath 选项的值可以是一系列的路径,多个路径之间在 Windows 平台上以分号(;)隔开,在Linux平台上则以冒号(:)隔开。
如果在运行Java程序时指定了 -classpath 选项的值,JRE 将严格按 -classpath 选项所指定的路径来搜索 Java 类,即不会在当前路径下搜索 Java 类,CLASSPATH环境变量所指定的搜索路径也不再有效。
如果想使 CLASSPATH 环境变量指定的搜索路径有效,而且还会在当前路径下搜索Java类,则可以按如下格式来运行 Java 程序:
java -classpath %CLASSPATH%;.; dir1;dir2;dir3...;dirN Java类
上面命令通过 %CLASSPATH% 来引用 CLASSPATH 环境变量的值,并在 -classpath 选项的值里添加了一个点,强制JRE在当前路径下搜索Java类。
也可以通过如下方式临时设置classpath 选项的值
set CLASSPATH=%CLASSPATH%;classpath1;classpath2...
12.Applet
Applet 是一种 Java 程序。它一般运行在支持 Java 的 Web 浏览器内。applet是和html或者是jsp一起使用的,不能单独运行(当然你可以使用appletviewer命令或者是ide去运行)
13.注释
注释是写给人看的,用于理解程序的存在。在编译时,编译器会忽略注释的存在。
Java中提供了三种注释方式,分别是:
单行注释 //注释内容
多行注释 /*注释内容*/ 多行注释不能嵌套,因为多行注释从 "/*"开始,一遇到"*/"就结束
文档注释 /**注释内容*/ 文档注释可以使用javadoc.exe命令生成API文档
14.关键字
关键字是被Java语言赋予特殊含义,具有专门用途的单词,不可乱用
Java中关键字均为小写,其中goto,const为保留字,即现在还没有被使用,以后可能被使用的单词。
main不是关键字,它是程序的入口点,也不可乱用。虽然建立一个Main.java是完全正确的。
15.标识符
在Java程序中,除了关键字以外基本上都是标识符了。一般指的是给变量,方法,类,接口等起的名字。
标识符组成:
字母(英文字母,中文字符,日文字符等都可以),数字(0-9),下划线(_),美元符($),人民币符号(¥)
标识符命名规则:
1.不能以数字开头
2.不能是关键字
3.严格区分大小写
标识符如“_”,Main,"$"等是完全正确的,但这种命名方式不推荐。
类的名字一般采用各个单词首字母大写的命名方式(大驼峰式)如"HelloWorld",方法的名字一般采用首字母小写其余单词首字母大写的命名方式(小驼峰式)如"addStudent"
Java中,常量的名称一般都使用大写,各个单词之间用下划线连接,如MAX_VALUE
参考:
https://blog.csdn.net/qq_42322103/article/details/89490692