目录
1、Java虚拟机 (Java Virtal Machine)
一、Java是什么?
Java是一门面向对象的编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点 。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等
二、Java语言特性
1、 简单性
Java 语言底层采用 C++语言实现,相对于 C++来说,Java 是简单的,在Java
语言中程序员不需要再操作复杂的指针(指针的操作是很复杂的),继承方面也是只支持单继
承(C++语言是一种半面向对象的编程语言,支持多继承,多继承会导致关系很复杂),在很
多方面进行了简化。
2、面向对象
Java是一个面向对象的语言,提供了封装、继承、多态等面向对象的机制。对程序员来说,这意味着要注意其中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和行为。每一对象是其状态和行为的封装。类是按一定体系和层次安排的,使得子类可以从超类继承行为。在这个类层次体系中有一个根类,它是具有一般行为的类。Java程序是用类来组织的。
3、健壮性
C++程序当中的无用数据/垃圾数据需要编程人员手动释放,当忘记释放内
存的时候,会导致内存使用率降低,影响程序的执行;在Java 语言当中这种问题得到了解决,
因为 Java 语言引入了自动垃圾回收机制(GC 机制),Java 程序启动了一个单独的垃圾回收线
程,时刻监测内存使用情况,在特定时机会回收/释放垃圾数据,这样会让内存时刻处于最好
的状态。
4、多线程
Java 语言支持多个线程同时并发执行,同时也提供了多线程环境下的安全机
制。Java是多线程语言,它提供支持多线程的执行(也称为轻便过程),能处理不同任务,使具有线索的程序设计很容易。Java的lang包提供一个Thread类,它支持开始线索、运行线索、停止线索和检查线索状态的方法。
Java的线索支持也包括一组同步原语。这些原语是基于监督程序和条件变量风范,由C.A.R.Haore开发的广泛使用的同步化方案。用关键词synchronized,程序员可以说明某些方法在一个类中不能并发地运行。这些方法在监督程序控制之下,确保变量维持在一个一致的状态。
5、 可移植性/ 跨平台
可移植性/跨平台表示Java 语言只需要编写/编译一次,即可处处运行 。Java 代码既可以运行在 windows 的环境下,又可以运行在 Linux 的环境下,而不需要修改Java 源程序,原因是使用“Java 虚拟机(Java Virtual Machine,简称JVM)”这种机制。
实际上 Java 程序运行的时候并不是直接运行在操作系统上面的,而是在操作系统上先安装了一个 JVM,把 Java 程序放到了 JVM 当中运行,JVM 屏蔽了各操作系统之间的差异,这样就完成了跨平台。但是,JVM 的出现虽然搞定了跨平台,同时也带来了一些问题,比如要想运行Java 程序就必须先安装 JVM,没有JVM,Java 程序是运行不了的,那么 Java 程序、Java 虚拟机、操作系统之间是怎样的关系呢?请看下图:
三、Java两种核心机制
1、Java虚拟机 (Java Virtal Machine)
JVM 是一个虚拟的计算机,具有指令集并使用不同的存储区域。负责执行指 令,管理数据、内存、寄存器。
对于不同的平台,有不同的虚拟机。 只有某平台提供了对应的java虚拟机,java程序才可在此平台运行。
Java虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,到处运行”。
2、垃圾收集机制 (Garbage Collection)
不再使用的内存空间应回收—— 垃圾回收。
在C/C++等语言中,由程序员负责回收无用内存。
Java 语言消除了程序员回收无用内存空间的责任:它提供一种系统级线程跟踪存储空
间的分配情况。并在JVM空闲时,检查并释放那些可被释放的存储空间。
垃圾回收在Java程序运行过程中自动进行,程序员无法精确控制和干预。
Java程序还会出现内存泄漏和内存溢出问题吗?Yes!
四、什么是JDK、JRE
1、JDK
JDK(Java Development Kit Java 开发工具包)
JDK是提供给Java开发人员使用的,其中包含了java的开发工具,也包括了JRE。
所以安装了JDK,就不用在单独安装JRE了。
其中的开发工具:编译工具(javac.exe) 打包工具(jar.exe)等
2、JRE
JRE(Java Runtime Environment Java 运行环境)
包括Java虚拟机(JVM Java Virtual Machine)和Java程序所需的核心类库等,
如果想要 运行一个开发好的Java程序,计算机中只需要安装JRE即可。
简单而言,使用JDK 的开发工具完成的java 程序,交给JRE
3、JDK 、JRE 、JVM 三者之间的关系
![](https://i-blog.csdnimg.cn/blog_migrate/4d640fbe4a58191610fe36de8d7e935d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/0dd1caf788494cdefd5ca7aa2a8e51ad.png)
JDK = JRE + 开发工具集(例如javac.exe、java.exe、javadoc.exe等工具)
JRE = JVM + Java SE标准类库
五、java程序开发到运行的过程
1、开发、编译和运行
步骤:
1. 将 Java 代码 编写到扩展名为 .java 的文件中。
2. 通过 javac 命令对该 java 文件进行 编译。
3. 通过 java 命令对生成的 class 文件进行
步骤详细描述:
第一步(写代码):
在任意位置创建一个.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 虚拟机解释器对字节码进行解释,最终解释为二进制码,然后操
作系统通过执行二进制指令来和硬件平台完成交互。默认情况下,类加载器去硬盘上找“字节码”文件的时候,默认从哪找????
默认情况下类加载器(classloader)会从当前路径下找。
此处应该有疑问,你可以提出哪些问题????
能不能给类加载器指定一个路径,让类加载器去指定的路径下加载字节码文件。
答案:可以的。但是我们需要设置一个环境变量,叫做:classpath
classpath是一个环境变量,是给谁指路的?
答案:是给“类加载器”指路的。
classpath环境变量不属于windows操作系统,classpath环境变量隶属于java。classpath环境变量是java特有的。
classpath=A路径;B路径;C路径.....
classpath是一个变量名
A路径;B路径;C路径.....是变量值
我们把classpath配置一下,这个环境变量在windows中没有,需要新建!!!!
计算机-->右键-->属性-->高级系统设置-->环境变量-->新建...
注意:变量名不能随意写:大小写无所谓,但必须叫做:classpath
CLASSPATH
ClassPath
Classpath
classpath
都行。
目前是随意配置的:(重启CMD)
classpath=D:\course
非常重要的一个特点,必须记住:
配置了classpath=D:\course之后,类加载器只会去D:\course目录下找“xxx.class”文件
不再从当前路径下找了。
2、classpath环境变量的作用是什么
是给类加载器指路的。
在没有配置环境变量classpath的时候,默认从当前路径下加载。
如果配置了环境变量classpath的话,就只能从指定的路径下加载了。
3、编译运行所用命令
javac 命令,负责编译
使用规则: 可同时编译多个源文件
javac java源文件的路径
例:javac K.java
(如果K.java原文件中有多个类的话,会生成多个class字节码文件)
java 命令,负责运行
使用规则: 同一时间 只能运行一个class文件
java 类名(就是class文件的名字)
例:java K
(不能加 “ .class” 后缀名)
六、public class 和 class的区别
- 一个 java 源文件中可以定义多个 class,在编译的时候一个 class 定义会对应编译生成一个xxx.class字节码文件。
- 一个 java 源文件中public 的 class 不是必须的,可以没有
- 如果定义 public class 的类,仅且只能定义一个,并且要求此类名必须和 java 源文件名保持一致
- 任何一个 class 中都可以设定程序入口,也就是说任何一个 class中都可以写 main 方法(主方法)。 想从哪个入口进去执行,则让类加载器先加载对应的类即可(注意:若执行的类中无main方法,就会出现运行错误),例如:想让 A类中的 main 方法执行,则执行:java A,想让 B 类中的 main 方法执行,则执行:java B。但实际上,对于一个完整的独立的应用来说,只需要提供一个入口,也就是说只需要定义一个 main 方法即可。
类加载机制:在程序执行前,凡是需要加载的类全部加载到JVM中,先完成加载才会执行main方法