01-JavaSE入门、JDK的下载与安装、第一个Java程序、Java程序的编译与执行

01-JavaSE入门、JDK的下载与安装、第一个Java程序、Java程序的编译与执行

Java的发展历史

Java是一种面向对象的程序设计语言,由Sun Microsystems公司的James Gosling等人于20世纪90年代初开发。它最初被命名为Oak,用来开发消费类电子产品,解决诸如电话、电视机等家用电器的控制和通讯问题。后来随着互联网的发展,Sun看到了Oak在计算机网络上的广阔应用前景,于是改造了Oak,在1995年5月正式命名为"Java",变化历程如下图1.1和1.2所示。

img

Java语言的版本

JavaSE

   Java SE(Java Platform,Standard Edition)。Java SE 以前称为J2SE。它允许开发和部署在桌面服务器、嵌入式环境和实时环境中使用的Java 应用程序。Java SE 包含了支持Java Web 服务开发的类,并为Java Platform,Enterprise Edition(Java EE)提供基础。
例子:类似QQ、扫雷、飞秋、凌波这样子的桌面应用。

Java EE

   Java EE(Java Platform,Enterprise Edition)。这个版本以前称为J2EE。企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器端 Java 应用程序。Java EE 是在Java SE 的基础上构建的,它提供Web 服务、组件模型、管理和通信API,可以用来实现企业级的面向服务体系结构(service-oriented architecture,SOA)和Web 2.0 应用程序。

Java ME

   Java ME(Java Platform,Micro Edition)。这个版本以前称为J2ME,也叫K-JAVA。Java ME 为在移动设备和嵌入式设备(比如手机、PDA、电视机顶盒和打印机)上运行的应用程序提供一个健壮且灵活的环境。Java ME 包括灵活的用户界面、健壮的安全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序的丰富支持。基于Java ME 规范的应用程序只需编写一次,就可以用于许多设备,而且可以利用每个设备的本机功能。

Java的特点

1.跨平台

何谓平台:即一套特定的硬件再加上运行其上的操作系统,即硬件+软件。

Java编译器将Java源程序编译成一种与体系结构无关的中间文件格式,称为字节码。只要有Java运行系统的机器都能执行这种中间代码。从而使同一版本的应用程序可以运行在不同的平台上。

怎样理解平台无关性呢?JVM (java Virtual Machine)起到了主要作用。JVM是运行在平台之上的程序,它能够虚拟出一台目标机,所有字节码就是在虚拟出的目标机上运行。

img

img

image-20221004173848525

image-20221004173904530

110是Windows上的指令。

101是linux上的指令。

Java跨平台

"write once run anywhere"

Java的跨平台是相对于其他编程语言而言的,通过Java语言编写的应用程序在不同的系统平台上都可以运行。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。在windows编译的c语言程序,在linux下是不能运行的,想要在linux下运行,那么就需要将c语言程序源码在linux平台上重新编译成linux平台的目标代码才行。当然在linux下编译的c语言程序在windows下也是不能运行的。而Java语言在不同平台上运行时不需要重新编译。

Java跨平台的原理:Java的跨平台是通过Java虚拟机(JVM)来实现的。

2.半编译半解释

源程序先编译成字节码,Java解释器(运行系统)能直接对Java字节码进行解释执行。链接程序通常比编译程序所需资源少,Java的编译和解释执行过程如下图1.4所示。

img

3.简单

Java是个精简的系统,无需强大的硬件环境便可以很好地运行。Java的风格和语法类似于C++,因此,C++程序员可以很快就掌握Java编程技术。Java摒弃了C++中容易引发程序错误的地方,如多重继承、运算符重载、指针和内存管理等,Java语言具有支持多线程、自动垃圾收集和采用引用等特性。Java提供了丰富的类库,方便用户迅速掌握Java。

4.面向对象

对象可以是人们研究的任何实体,小到一个原子大到整个宇宙,均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、概念等。对象之间通过消息相互作用,用公式表示,面向对象编程语言可以表示为:程序=对象+消息。现实世界中的对象均有属性和行为,映射到计算机程序上,属性就表示对象的数据(用来表示对象的状态),行为就表示对象的方法(用来处理数据或同外界交互)。

所有面向对象编程语言都支持三个概念:封装、继承和多态,Java也不例外。

面向对象可以说是Java最基本的特性。Java语言的设计完全是面向对象的,它不支持类似C语言那样的面向过程的程序设计技术。所有的Java程序和applet均是对象,Java支持静态和动态风格的代码继承及重用。

5.分布式

Java包括一个支持HTTP和FTP等基于TCP/IP协议的子库。因此,Java应用程序可凭借URL打开并访问网络上的对象,就像访问本地文件一样简单方便。Java的分布性为实现在分布环境尤其是Internet下实现动态内容提供了技术途径。

6.健壮

Java提供了自动垃圾收集机制来进行内存管理,并检测程序对内存的访问,确定合法并不会引起任何问题后,才允许访问。

Java还提供了异常处理机制用来检查编译及运行时可能出现的问题,Java在编译和运行程序时要对可能出现的异常进行检查;同时,Java在编译时还可捕获类型声明中的许多常见错误,帮助程序员消除错误,防止系统崩溃。

7、安全

作为网络语言,安全是非常重要的。Java的安全性可从两个方面得到保证。一方面,在Java语言里,像指针和释放内存等C++功能被删除,避免了非法内存操作。另一方面,当Java用来创建浏览器时,语言功能和一类浏览器本身提供的功能结合起来,使它更安全。Java语言在你的机器上执行前,要经过很多次的测试。它经过代码校验,检查代码段的格式,检测指针操作,试图改变一个对象的类型。另外,Java拥有多个层次的互锁保护措施,能有效地防止病毒的入侵和破坏行为的发生。Java不支持指针,避免了由于指针操作所引起的错误和非法入侵。同时,Java在运行应用程序时,严格检查其访问数据的权限,保证数据的可靠性。

8.多线程

线程有时也称小进程,是一个大进程里分出来的小的独立运行的基本单位。Java提供的多线程功能使得在一个程序里可同时执行多个小任务,即同时进行不同的操作或处理不同的事件。多线程带来的更大的好处是具有更好的网上交互性能和实时控制性能,尤其是实现多媒体功能。

Java开发环境的搭建

Java运行环境就是JRE (Java Runtime Environment),是由Sun所研发的,是一个软件, JRE可以让计算机系统执行Java应用程序,它是运行JAVA程序所必须的环境的集合,JRE的内部有一个JAVA虚拟机(Java Virtual Machine,JVM)以及一些标准的类库(Class Library),如果你只需要运行Java程序,下载并安装它即可。

如果你要自行开发 Java软件,请下载JDK。在JDK中附带有JRE。最新版本下载地址http://www.oracle.com/technetwork/java/javase/downloads/index.html。

java的环境的搭建:

jre: java运行环境。 jre = java虚拟机 + 核心类库(辅助java虚拟机运行的文件)

jdk: java开发工具集 jdk = jre + java开发工具。

java开发工具,例如,javac编译工具,java解释器执行工具。

如果只是软件使用者,那么安装jre即可,提供运行环境。

如果是软件开发者,那么就需要安装jdk。因为需要开发工具。

JRE Java Runtime Environment Java运行环境。包括Java虚拟机(JVM Java Virtual Machine)和Java程序所需的核心类库等,如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。

JDK 是整个Java的核心,包括了Java运行环境、Java工具和Java基础类库。

image-20221004174307304

image-20221004174351709

img

第一个Java程序

img

img

Java程序运行的原理

Java程序运行在Java虚拟机上,Java虚拟机就是指JVM (Java Virtual Machine) ,这是一个虚构出来的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统,编辑、编译及运行Java程序的过程如图1.13所示。

img

图1.13编辑、编译及运行Java程序的过程

一个运行时的Java虚拟机实例的天职就是:负责运行一个Java程序。Java虚拟机的主要任务是装载class文件并且解释执行其中的字节码。当启动一个Java程序时,一个虚拟机实例也就诞生了。当该程序关闭退出,这个虚拟机实例也就随之消亡。如果同一台计算机上同时运行三个Java程序,将得到三个Java虚拟机实例。每个Java程序都运行于它自己的Java虚拟机实例中,如下图1.14所示。

img

img

图 运行时过程

编译源文件:java源代码被java编译器编译(Compile)。如果这时产生错误,我们称为编译错误。如果没有错误,则生成字节码(byte code)。

运行字节码:这里,java字节码被装载到java虚拟机中,解释成本地代码再运行。如果此时产生错误,我们称之为运行时错误(Runtime)。

注释的使用

Java 的注释是被Javac忽略的部分,Java中的注释包含下面三种。

1.单行注释

// 单行注释

2.多行注释

/* 多行注释 */

3.文档注释

/** 文档注释 */

Java的注释如下图1.17所示。

img

Java中的修饰符如下图1.19所示,其中public用来修饰类,也可以修饰方法,static用来修饰main方法,void是main方法的返回值类型,表示此方法没有返回值。

img

类和主方法

Java中的类和主方法的结构图下图1.20所示,主方法在类的内部,类里包含方法。

img


Java跨平台性是通过JVM(Java虚拟机)来实现的。

JVM是不具有跨平台性的,针对不同的平台分别设计了对应的JVM。通过不同平台的JVM来实现了Java程序的跨平台性。也就是通过JVM的不跨平台性来支持Java程序的跨平台性。

Java代码的执行:

编译:Java源码通过javac命令编译成class字节码文件。

解释执行:class字节码文件通过java命令解释执行。

Java源码->编译->class字节码文件->解释器解释执行

注意,class字节码文件是与特定硬件平台无关的中间代码,从而实现了在不同平台上的JVM上的解释执行,实现跨平台性。

Java字节码的两种执行方式:

即时编译:解释器(JVM)将字节码编译成对应硬件平台的机器码(二进制指令),然后再在该平台上直接执行该机器码,速度快,效率高。

解释执行:解释器每次解释并执行字节码中的一小段代码,从而实现字节码的执行。

Java程序执行与C/C++程序执行对比:

img

JVM相当于80x86计算机。

JVM中的Java解释器相当于80x86 CPU。

在80x86 CPU上运行的是C/C++源码编译之后的机器码,在JVM解释器上运行的是Java源码编译之后的字节码。

当前不是所有平台都提供了JVM的,因此,Java代码只能在已经实现了JVM软件的并且安装了JVM软件的平台上运行。

javac命令就是java编译器。

java命令就是java解释器。利用解释器去装载字节码的时候,会自动的启动jvm虚拟机。使字节码在jvm内部运行。

Java源文件编译过程:

Java应用程序的开发周期包括编译、下载、解释和执行几个部分。Java编译程序将Java源程序翻译为JVM可执行代码—字节码。这一编译过程同C/C++的编译有些不同。当C编译器编译生成一个对象的代码时,该代码是为在某一特定硬件平台运行而产生的。因此,在编译过程中,编译程序通过查表将所有对符号的引用转换为特定的内存偏移量,以保证程序运行。Java编译器却不将对变量和方法的引用编译为数值引用,也不确定程序执行过程中的内存布局,而是将这些符号引用信息保留在字节码中,由解释器在运行过程中创建内存布局,然后再通过查表来确定一个方法所在的地址。这样就有效的保证了Java的可移植性和安全性。

解释器解释执行分为3步:

代码的装入、代码的校验、代码的执行。

运行JVM字节码的工作是由解释器来完成的。解释执行过程分三步进行:代码的装入、代码的校验和代码的执行。装入代码的工作由“类装载器”(class loader)完成。类装载器负责装入运行一个程序需要的所有代码,这也包括程序代码中的类所继承的类和被其调用的类。当类装载器装入一个类时,该类被放在自己的名字空间中。除了通过符号引用自己名字空间以外的类,类之间没有其他办法可以影响其它类。在本台计算机上的所有类都在同一地址空间内,而所有从外部引进的类,都有一个自己独立的名字空间。这使得本地类通过共享相同的名字空间获得较高的运行效率,同时又保证它们与从外部引进的类不会相互影响。当装入了运行程序需要的所有类后,解释器便可确定整个可执行程序的内存布局。解释器为符号引用同特定的地址空间建立对应关系及查询表。通过在这一阶段确定代码的内存布局,Java很好地解决了由超类改变而使子类崩溃的问题,同时也防止了代码对地址的非法访问。

随后,被装入的代码由字节码校验器进行检查。校验器可发现操作数栈溢出,非法数据类型转换等多种错误。通过校验后,代码便开始执行了。

Java基础类库,都内置在jdk中。

demo目录是提供的一些例子程序。

lib目录就是提供的一些基础类库。

jre目录就是运行时环境。

linux/unix下,换行是一个字符来表示的,ascII表示就是10。

windows下,换行是两个字符来表示,实际是回车+换行,ascII表示就是13和10。来表示一个回车+换行。

Java中所有功能都需要通过类来完成,也就是说Java中最小组织单位就是类。

JDK、JRE、JVM关系示意图

img

https://img2020.cnblogs.com/blog/2170368/202010/2170368-20201013143113378-1314191418.png

JRE (Java Runtime Environment) :是Java程序的运行时环境,包含 JVM 和运行时所需要的 核心类库 。
JDK (Java Development Kit):是Java程序开发工具包,包含 JRE 和开发人员使用的工具。
我们想要运行一个已有的Java程序,那么只需安装 JRE 即可。
我们想要开发一个全新的Java程序,那么必须安装 JDK 。

三者关系: JDK > JRE > JVM

img

Java程序的执行过程

所有的Java代码,其后缀都是以java结尾,Java程序的执行过程分为两步:

\1. 编译

\2. 执行

Class文件是字节码文件,程序最终执行的就是这个字节码(bytecode)文件。

编译命令:java Hello.java

执行命令:java Hello(注意,Test后面没有.class)

注意,加载的是类,而不是class字节码文件。执行的流程就是首先根据java命令后面的要加载的类的名字来找到对应的名字的class文件,然后JVM会将class文件加载到内存的方法区中,然后将class文件解开,就会找到里面对应的那个类,然后就可以加载这个类进行运行。

Java是跨平台的语言,真正执行的不是二进制代码,而是字节码。

JVM(Java Virtual Machine,Java虚拟机)

Java是跨平台的,而JVM不是跨平台的(JVM是由C语言编写的)

Java之所以能够做到跨平台,本质原因在于JVM不是跨平台的。


posted @ 2022-12-09 19:52  Leo101018  阅读(197)  评论(0编辑  收藏  举报
返回顶部