目录
- JDK、JRE和JVM有何区别?
- Java的跨平台原理是什么?
- 描述一下 JVM 加载 class 文件的原理机制?
- Java有什么核心优势让其成为世界上最流行的编程语言之一?
- 编译和执行Java程序的命令是什么?
JDK、JRE和JVM有何区别?
JDK包含JRE,比JRE多了开发和调试的工具,比如把Java文件编译成class文件的javac,在比如一些诊断工具jmap,jconsole,jheap还有反编译工具javap
JDK是最全面的,包含了JRE和JVM以及开发工具
JRE是运行java应用程序的最小环境,他包含了JVM和Java核心类库,是包含在JRE中的lib目录下的rt.jar包中的,但JRE不包括开发工具
Java的跨平台原理是什么?
跨平台定义:跨平台指的是基于源代码的跨平台,只写一套代码,在各个平台上如Windows、Linux、unix、mac上都可以顺利运行
- Java源程序(.java文件)要先编译成与平台无关的字节码(.class文件),然后字节码文件再解释成机器码运行(解释通过Java虚拟机来执行的)
- 字节码文件(.class文件)不面向任何具体平台,只面向虚拟机
- Java虚拟机时刻运行Java字节码文件的虚拟计算机,不同平台虚拟机是不同的,他们有相同的接口
- Java语言具有一次编译,到处运行的特点,就是说编译后的字节码文件(.class文件)可以跨平台运行,前提是该平台已经安装有相应的虚拟机
- Java的跨平台原理决定了其性能没有C/C++高
描述一下 JVM 加载 class 文件的原理机制?
Java中的所有类,都需要由类加载器装载到JVM中才能运行。类加载器本身也是一个类,而它的工作就是把class文件从硬盘读取到内存中。在写程序的时候,我们几乎不需要关心类的加载,因为这些都是隐式装载的,除非我们有特殊的用法,像是反射,就需要显式的加载所需要的类。
类装载方式,有两种
1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中,
2.显式装载, 通过class.forname()等方法,显式加载需要的类
隐式加载与显式加载的区别:两者本质是一样?
Java类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(像是基类)完全加载到jvm中,至于其他类,则在需要的时候才加载。这当然就是为了节省内存开销。
Java的类加载器有三个,对应Java的三种类:(java中的类大致分为三种: 1.系统类 2.扩展类 3.由程序员自定义的类 )
Bootstrap Loader // 负责加载系统类 (指的是内置类,像是String,对应于C#中的System类和C/C++标准库中的类)
|
- - ExtClassLoader // 负责加载扩展类(就是继承类和实现类)
|
- - AppClassLoader // 负责加载应用类(程序员自定义的类)
三个加载器各自完成自己的工作,但它们是如何协调工作呢?哪一个类该由哪个类加载器完成呢?为了解决这个问题,Java采用了委托模型机制。
委托模型机制的工作原理很简单:当类加载器需要加载类的时候,先请示其Parent(即上一层加载器)在其搜索路径载入,如果找不到,才在自己的搜索路径搜索该类。这样的顺序其实就是加载器层次上自顶而下的搜索,因为加载器必须保证基础类的加载。之所以是这种机制,还有一个安全上的考虑:如果某人将一个恶意的基础类加载到jvm,委托模型机制会搜索其父类加载器,显然是不可能找到的,自然就不会将该类加载进来。
我们可以通过这样的代码来获取类加载器:
1
2
ClassLoader loader = ClassName.class.getClassLoader();
ClassLoader ParentLoader = loader.getParent();
注意一个很重要的问题,就是Java在逻辑上并不存在BootstrapKLoader的实体!因为它是用C++编写的,所以打印其内容将会得到null。
前面是对类加载器的简单介绍,它的原理机制非常简单,就是下面几个步骤:
1.装载:查找和导入class文件;
2.连接:
(1)检查:检查载入的class文件数据的正确性;
(2)准备:为类的静态变量分配存储空间;
(3)解析:将符号引用转换成直接引用(这一步是可选的)
3.初始化:初始化静态变量,静态代码块。
这样的过程在程序调用类的静态成员的时候开始执行,所以静态方法main()才会成为一般程序的入口方法。类的构造器也会引发该动作。
Java有什么核心优势让其成为世界上最流行的编程语言之一?
- 跨平台性(平台无关性):
Java 最大的亮点之一是“一次编写,到处运行”(Write Once, Run Anywhere, WORA)。这是通过 Java 虚拟机(JVM)实现的,JVM 可以在任何安装了它的平台上运行 Java 字节码。这种跨平台能力极大地简化了程序在不同操作系统(如 Windows、Linux、macOS)上的部署和迁移工作。 - 面向对象编程(OOP):
Java 是一种纯粹的面向对象语言,它支持封装、继承和多态等面向对象的特性。这些特性使得 Java 代码更加模块化、易于维护和扩展。面向对象的编程思想也促进了软件工程的发展,使得大型项目的开发更加有序和高效。 - 丰富的类库和框架:
Java 拥有庞大的标准库(Java SE),提供了大量的类和接口,涵盖了网络编程、数据库访问、图形用户界面开发等多个方面。此外,Java 社区还贡献了大量的第三方库和框架,如 Spring、Hibernate、MyBatis 等,这些工具和框架极大地简化了 Java 应用的开发过程。 - 安全性:
Java 设计时就考虑了安全性问题,提供了丰富的安全特性,如访问控制、自动内存管理(垃圾回收)、类加载器架构等。Java 应用程序运行在沙箱环境中,限制了程序对系统资源的访问,从而减少了恶意代码的危害。 - 高性能:
随着 JVM 的不断优化和 JIT(即时编译器)技术的引入,Java 程序的运行性能得到了显著提升。现代 JVM 能够将 Java 字节码高效地转换为本地机器码,从而在保持跨平台性的同时,提供了接近甚至超过传统编译型语言的性能。 - 广泛的社区支持和开源文化:
Java 拥有庞大的全球开发者社区,这些开发者通过论坛、博客、GitHub 等平台分享经验、解决问题、贡献代码。此外,Java 社区还积极推广开源文化,许多优秀的 Java 项目都是开源的,这进一步促进了 Java 技术的发展和应用。 - 稳定性和可靠性:
Java 在设计时就注重稳定性和可靠性,经过多年的发展和应用实践,Java 已经证明了自己在构建稳定、可靠的大型系统方面的能力。许多关键业务系统和基础设施都采用了 Java 技术,如银行系统、电子商务平台、云计算平台等。
编译和执行Java程序的命令是什么?
javac命令windows+R
javac A.java 回车 java A(A是Java文件名)输出执行结果
假设输出的是中文,会怎么样?
修改代码与输出结果,两种情况与两种结果(错误:编码GBK的不可映射字符||能编译成功,但是输出乱码)
带包名的类如何编译
package mypack;
public class A {
public static void main(String[] args) {
System.out.println("abc");
}
}
标签:JRE,Java,基础,跨平台,之源,JVM,class,加载
From: https://www.cnblogs.com/yangcurry/p/18470582