Java基础–跨平台 JDK安装 JRE JVM 结构内存

  • Post author:
  • Post category:java


前言:Java是一门跨平台计算机编程语言

本章学习理解目标

①跨平台有什么好处

②Java怎么支持跨平台

②如何配置java环境


1.什么是平台,为什么要跨平台


该部分转自CSDN上woyouzai作者的文章

点击打开链接


我们把CPU处理器+操作系统的整体叫平台,1,CPU类型,也就是指令集类型;2,操作系统,操作系统是充当用户和计算机之间交互的界面软件,我们常见的操作系统有win7 win10;我们把这种软硬件的结合叫平台,也可以说“平台= CPU+OS”,又因为现在主流的操作系统都支持主流的CPU,所以有时也把操作系统称为平台,不同的操作系统支持不同的CPU

首先看一张与C语言有关的图:

该部分转自CSDN上woyouzai作者的文章

使用不同的编译器编译后的可执行文件是可以在对应平台运行的,比如windows可以使用VC编译,那编译后的exe文件就可以在windows下运行;liunx下可以使用GCC编译,生成的可执行文件就可以在Liunx上运行

到这里请大家思考一个问题:“VC编译的exe能在Liunx上运行吗?”

答案肯定是否定的。使用特定编译器编译的程序只能在对应的平台运行,这里也可以说编译器是与平台相关的,编译后的文件也是与平台相关的。

我们说的语言跨平台是编译后的文件跨平台,而不是源程序跨平台,如果是源程序,任何一门语言都是跨平台的语言了


为什么c语言不支持跨平台。同样的道理,c语言不支持跨平台原因:编译时候,需要指定机器cpu,即平台,

所以为什么说C语言不能实现跨平台运行,就是因为它编译出来的 输出文件的格式,只适用于某种cpu,其他cpu不认识啊


2.为什么能跨平台


Java之所以能跨平台,是因为java虚拟机(JVM)能跨平台。

虚拟机(Virtual Machine),在计算机科学中的体系结构裏,是指一种特殊的软件,他可以在计算机平台和终端用户之间创建一种环境,而终端用户则是基于这个软件所创建的环境来操作软件。在计算机科学中,虚拟机是指可以像真实机器一样运行程序的计算机的软件实现。

JAVA程序不是直接在电脑上运行的,是在Java虚拟机 Java Virtual Machine(简称JVM)上进行的(

java源文件编译成中间码.class文件,.class文件通过类加载器class.loader在jvm上运行

),每个系统平台都是有自己的虚拟机(JVM),所以JAVA语言能跨平台


3.Java如何实现支持跨平台


上面我们说到是因为JVM支持java跨平台,那么对应java的jvm是如何配置实现的

这里我们需要了解JDK和JRE

JDK:(Java Development Kit)英文翻译字面意思Java开发环境

JRE:(Java RunTime Environment) Java运行环境,包括Java虚拟机以及Java程序所需的核心类库,既然是运行环境,当然要包含JVM,也就是虚拟机(目录一般JDK/jre/bin/server/jvm.dll),还有所有java类库class文件,都在lib目录下成jar包

如下是Java程序运行过程及跨平台原理表示图:

①编辑源代码xxx.java,存储于java文件中

② JDK中编译器java.exe讲源代码编译成java字节码,存储于.class文件

③JRE加载(类加载器),验证,执行java字节码

④JVM将字节码解析并映射到CPU指令集或OS系统调用(JVM中的执行引擎找到入口方法main(),执行其中的方法)

在这里插入图片描述

Java先编译后解释,先由.java文件编辑成.class文件再解释执行


上图中的.java就是源程序,类似于c语言的.c,生成的中间码是.class,这个既是我们上文中说的中间语,各个平台解释器就是各种国家翻译。

接下来我们再比较下两种方式的差异:

第一,C语言是编译执行的,编译器与平台相关,编译生成的可执行文件与平台相关;

第二,Java是解释执行的,编译为中间码的编译器与平台无关,编译生成的中间码也与平台无关(一次编译,到处运行),中间码再由解释器解释执行,解释器是与平台相关的,也就是不同的平台需要不同的解释器.

这里再说下语言根据执行方式的不同分类:

第一是编译执行,如上文中说到的C,它把源程序由特定平台的编译器一次性编译为平台相关的机器码,它的优点是执行速度快,缺点是无法跨平台;

第二是解释执行,如HTML,JavaScript,它使用特定的解释器,把代码一行行解释为机器码,类似于同声翻译,它的优点是可以跨平台,缺点是执行速度慢,暴露源程序;

第三种是从Java开始引入的“中间码+虚拟机”的方式,它既整合了编译语言与解释语言的优点,同时如虚拟机又可以解决如垃圾回收,安全性检查等这些传统语言头疼的问题,所以其后微软的.NET平台也使用的这种方式。

同一个.class文件在不同的虚拟机会得到不同的机器指令(Windows和Linux的机器指令不同),但是最终执行的结果却是相同的


4.安装部署jdk


①安装JDK配置开发环境

一个jdk的安装包

在这里插入图片描述

点击配置安装jdk,按照步骤(可以选择jdk安装目录,)安装完成后,先查看下jdk目录内容

在这里插入图片描述
JDK目录下内容介绍:


a.bin目录:用于存放一些可执行程序


在这里插入图片描述

如:javac.exe 、 java.exe、 javaw.exe 、 javaws.exe这几个程序用处,有篇文章详细说明(转自CSDN上Lord_Bao作者的文章

点击打开链接



javac.exe 是编译程序 ,它将.java文件编译成 .class 文件。

java.exe 是java的启动程序,它有一个与它相关的控制台。

javaw.exe 也是java的启动程序,它与java.exe 没有多大差别,只是它没有一个相关的控制台用于交互而已。

javaws.exe 是用来启动web分发的java的程序

javadoc.exe 文档生成器,从源码注释中提取文档

jdb.exe :debugger 查错工具

appletviewer.exe 小程序浏览器,一种执行html的程序

javah.exe 产生可以调用Java过程的C过程 ,或建立能被java程序调用的C过程的头文件

javap.exe :java反汇编器,显示编译类文件中的可以访问功能和数据,同时显示字节码含义

jconsole.exe :java进行系统调试和监控的工具


b.jre目录:Java运行环境,目录包含bin和lib文件夹


bin:包含jvm(JDK\jre\bin\server)

lib:所有java类库class文件,都在lib目录下成jar包

在这里插入图片描述


c.lib目录:Java类库或者库文件,Java程序所需的核心类库,tools.jar dt.jar

,Java扩展的许多类都放在java主包及其子包下

这些实用类也就是我们所说的API,按照这些类的功能分别放在不同的包下,常用的包分类如下

1.java.lang包,最基础的包、核心类库。常用类有String、Math、Thread、Object、包装类Integer、Character等,常用接口有Runnable、Iterable、Comparable。

2.java.util包,实用工具包。常用类有Arrays、Scanner、Random、HashSet、HashMap、ArrayList、Date等,常用接口有Collection、Set、List等。

3.java.io包,提供数据输入输出。常用类有File、FileInputStream、Reader等提供文件、字节输入输出的类。

4.java.net包,为网络连接提供服务。常用类有Socket、ServerSocket、URL等。

5.java.sql包,连接数据库的包。要实现jdbc类库。

6.java.awt包,创建用户界面、绘图的。常用类有Button、Panel、(JButton、JPanel)等。

7.java.swing包 图形用户界面相关接口和类(可跨平台)

②配置环境变量:

找到控制面板 =》 系统和安全 =》 系统 =》 高级系统设置 =》 高级 =》 环境变量

注:环境变量分为系统环境变量和用户环境变量。环境变量是指系统环境变量,对所有用户起作用,而用户环境变量只对当前用户起作用,配置在哪里看个人需要了

1、系统变量:创建JAVA_HOME

变量名:JAVA_HOME

变量值:D:\JDK

在这里插入图片描述

2、系统变量创建CLASS_PATH

Classpath设置的目的,在于告诉Java执行环境,在哪些目录下可以找到您所要执行的Java程序所需要的类或者包

变量名: CLASSPATH

变量值: .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;

在这里插入图片描述

注意,classpath最前面的.必须加上,它表示可以让你在任何目录下都可以运行java。

3、系统变量path添加两个bin目录路径

在这里插入图片描述

二、cmd打开命令行

输入java和javac进行验证

输入命令java

在这里插入图片描述

输入命令javac

在这里插入图片描述

有时候输入命令验证会弹出

javac不是内部或外部命令,也不是可运行的程序或批处理文件

,错误原因说白了就是通过环境变量路径没找到javac.exe,通过path里面配置的%java_home%\bin 看下能不能找到javac.exe

我们编译的也是这个javac.exe

测试如下,编写一个java文件 执行javac JavaTest.java命令 会生成一个JavaTest.class中间码文件,我们在执行java xxx编译命令

package day01;
public class JavaTest {
	public static void main(String[] args) {
			System.out.println("helloWord");		
	}
}

在这里插入图片描述

这里在执行编译文件的执行javac javatest命令报错“

找不到或无法加载主类

“,这个错误的原因就是没有找到这个中间码文件路径,看看java的书籍就会发现,

一个类的全名应该是包名+类名

。类javaTest的全名:day01.JavaTest,所有我们在执行java JavaTest 根本找不到这个类,我们应该执行的是java day01.JavaTest这个命令,

但如果在当前路径下 执行这个命令,其实它会以为类的路径是我当前的文件路径 F:\第一阶段\java_se01\src\day01\ day0\JavaTest,所有应该返回上一层,这样就好了

在这里插入图片描述



版权声明:本文为weixin_44891364原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。