type
status
date
slug
summary
tags
category
icon
password
Property
Java
最早是由SUN
公司(已被Oracle
收购)的詹姆斯·高斯林(Java之父)在上个世纪90年代初开发的一种编程语言,最初被命名为Oak,目标是针对小型家电设备的嵌入式应用,结果市场没啥反响。谁料到互联网的崛起,让Oak重新焕发了生机,于是SUN公司改造了Oak,在1995年以Java
的名称正式发布,原因是Oak
已经被人注册了,因此SUN
注册了Java
这个商标。随着Java的发展,SUN给Java又分出了三个不同版本:
- Java SE:Standard Edition
- Java EE:Enterprise Edition
- Java ME:Micro Edition
Java SE
是标准版,包含标准的JVM和标准库;Java EE
是企业版,它只是在Java SE
的基础上加上了大量的API和库,以便方便开发Web应用、数据库、消息服务等,Java EE
的应用使用的虚拟机和Java SE
完全相同;Java ME
就和Java SE
不同,它是一个针对嵌入式设备的“瘦身版”,Java SE
的标准库无法在Java ME
上使用,Java ME
的虚拟机也是“瘦身版”。JDK、JRE、JVM
- JDK:Java Development Kit【Java开发工具箱】
- JRE:Java Runtime Environment【Java的运行时环境】
- JVM:【Java虚拟机】
JRE
是运行Java字节码的虚拟机。但是,如果只有Java
源码,要编译成Java
字节码,就需要JDK
,因为JDK
除了包含JRE
,还提供了编译器、调试器等开发工具。Java介于编译型语言和解释型语言之间
- 编译型语言如
C
、C++
,代码是直接编译成机器码执行,但是不同的平台(x86、ARM等)CPU的指令集不同,因此,需要编译出每一种平台的对应机器码。
- 解释型语言如
Python
、Ruby
没有这个问题,可以由解释器直接加载源码然后运行,代价是运行效率太低。
- 而
Java
是将代码编译成一种字节码,它类似于抽象的CPU指令,然后,针对不同平台编写虚拟机,不同平台的虚拟机负责加载字节码并执行,这样就实现了一次编写,到处运行的效果。当然,这是针对Java
开发者而言。对于虚拟机,需要为每个平台分别开发。为了保证不同平台、不同公司开发的虚拟机都能正确执行Java
字节码,SUN公司制定了一系列的Java
虚拟机规范。从实践的角度看,JVM
的兼容性做得非常好,低版本的Java
字节码完全可以正常运行在高版本的JVM
上。
Java语言特性
- 跨平台/可移植
Java
程序并没有和底层的操作系统直接交互,程序实际上运行在jvm
当中,JVM
和操作系统交互,JVM
屏蔽了操作系统之间的差异。但是有一个前提:不同的操作系统中必须安装不同版本的JVM
。在可移植性方面表现非常好,一次编译,到处运行。但是为了达到可移植,必须提前在操作系统中安装
JRE
,JRE
有了之后才会有JVM
,JVM
不能单独安装,这方面体验不是特别好。- Java号称:开源、免费、跨平台、纯面向对象。
- 简单性:这里的简单说的是相对于C语言来说的,例如:
C
语言当中有指针,C++
中多继承,java
取消了指针的概念,取消了多继承,只支持单继承。
- 支持多线程
- 有一种特殊的机制:自动垃圾回收机制(GC机制),java运行过程当中有一个“垃圾回收器”一直在守护者。
Java语言的规范
- JSR规范:Java Specification Request
- JCP组织:Java Community Process
- RI:Reference Implementation
- TCK:Technology Compatibility Kit
为了保证Java语言的规范性,SUN公司搞了一个JSR规范,凡是想给Java平台加一个功能,比如说访问数据库的功能,大家要先创建一个JSR规范,定义好接口,这样,各个数据库厂商都按照规范写出Java驱动程序。负责审核JSR的组织就是JCP。
一个JSR规范发布时,为了让大家有个参考,还要同时发布一个“参考实现”,以及一个“兼容性测试套件”:比如有人提议要搞一个基于Java开发的消息服务器,光有提议不行,得贴出真正能跑的代码,这就是RI。如果有其他人也想开发这样一个消息服务器,如何保证这些消息服务器对开发者来说接口、功能都是相同的?所以还得提供TCK。通常来说,RI只是一个“能跑”的正确的代码,它不追求速度,所以,如果真正要选择一个Java的消息服务器,一般是没人用RI的,大家都会选择一个有竞争力的商用或开源产品。
Java安装
安转JDK
从下面官网下载JDK并安装:
我装的是JDK17
设置环境变量
windows操作系统在查找某个命令的时候是怎么查找的?
首先会从当前目录下找这个命令;当前目录下不存在这个命令的话,会去环境变量path指定的路径当中查找该命令;还是找不到则出现错误提示信息。path环境变量隶属于windows操作系统,这个环境变量主要用来指定命令的搜索路径。
以我的环境为例:
我的JDK安装路径为
B:\Java\jdk17
- 设置一个
JAVA_HOME
的环境变量,它指向JDK的安装目录:
- 然后,把
JAVA_HOME
的bin
目录附加到系统环境变量PATH
上:%JAVA_HOME%\bin
(使用B:\Java\jdk17
下的bin目录)
- 打开命令提示符窗口,输入
java -version
,测试
JAVA_HOME
的bin
目录下的可执行文件:java
:这个可执行程序就是JVM
,运行Java
程序,就是启动JVM
,然后让JVM
执行指定的编译后的代码;
javac
:Java
的编译器,用于把Java
源码文件(以.java
结尾)编译为Java
字节码文件(以.class
结尾)
jar
:用于把一组.class
文件打包成一个.jar
文件,便于发布
javadoc
:用于从Java
源码中自动提取注释并生成文档
jdb
:Java
调试器,用于开发阶段的运行调试
Java的加载与执行
Java开发的整个生命周期,包括两个重要的阶段,分别是:编译阶段和运行阶段
编译生成的程序被称为:字节码程序,编译生成的文件是:xxx.class文件
编译和运行可以在不同的操作系统中完成。
程序员在
xxx.java
文件中编写源代码,源代码必须符合java
的语法,这些源代码就是高级语言。存放源代码的文件被称为源文件。编译期:【在当前windows环境中完成】
- 在硬盘的某个位置创建一个
xxx.java
源文件
- 在源文件中编写符合
java
语法的源程序,然后保存
- 使用JDK中自带的
javac.exe
命令对以上的java
源程序进行编译 - 编译通过:说明语法没有问题,在硬盘上生成一个或者多个字节码文件【
xxx.class
】 - 编译失败:说明源程序某个位置不符合
java
语法格式
编译的语法格式:进入DOS命令窗口,输入:javac 源文件路径(绝对路径/相对路径)
注意:编译之后,其实
java
源文件删除不会影响程序的执行。最好不要将java
源文件删除,因为程序最终运行效果不是预期效果的时候,需要重新修改java
源代码,然后进行重新编译生成全新的class
字节码文件,再重新运行字节码程序运行期:【可以不在windows中完成,可以换一个操作系统,前提是该系统中安装java的运行时环境】
- 打开命令窗口,在命令窗口中使用
java.exe
命令运行java
程序,语法格式:java 类名
注意:
java
这个命令使用的时候,java
命令后面不是文件的路径,必须是一个“类名”,例如:- 以上程序的执行原理:
java.exe
命令执行会启动:JVM- JVM启动之后,马上启动“类加载器-Class Loader”
ClassLoader
负责去硬盘的“某个位置”上搜索“类名.class
”字节码文件- 找不到这个
.class
文件,一定会出现程序异常现象;找到这个.class
文件之后,将.class文件转换成"二进制",操作系统可以直接识别二进制,执行二进制码和底层的硬件平台进行交互。
什么是类名?
假设硬盘上有一个文件,叫做
Hello.class
,那么类名就叫做Hello
。假设文件叫做Student.class
,那么类名就叫做:Student
打开文本编辑器,输入以下代码:
java程序基本结构
注释
javadoc
注释是比较专业的注释,该注释信息会被javadoc.exe
工具解析提取并生成帮助文档class
Java是面向对象的语言,一个程序的基本单位就是
class
,class
是关键字类名要求:
- 类名必须以英文字母开头,后接字母,数字和下划线的组合
- 习惯以大写字母开头
public
是访问修饰符,表示该class
是公开的。不写public
也能编译,但是这个类将无法从命令行执行。public class 和 class的区别:
- 一个
java
源文件当中可以定义多个class
- 一个
java
源文件当中public
的class
不是必须的
- 一个
class
会定义生成一个xxx.class
字节码文件
- 一个
java
源文件当中定义公开的类的话,只能有一个,并且该类名称必须和java
源文件名称一致。
- 每一个
class
当中都可以编写main
方法,都可以设定程序的入口,
想执行
B.class
中的main
方法:java B
想执行X.class
当中的main
方法:java X
注意:当在命令窗口中执行
java Hello
,要求Hello.class
当中必须有主方法method
在
class
内部,可以定义若干方法(method):这里的方法名是
main
,返回值是void
,表示没有任何返回值。public
除了可以修饰class
外,也可以修饰方法。而关键字static
是另一个修饰符,它表示静态方法。Java
入口程序规定的方法必须是:静态方法,方法名必须为main
,括号内的参数必须是String
数组方法定义了一组执行语句,方法内部的代码将会被依次顺序执行,
Java
的每一行语句必须以分号结束。