day3:区别JDK、JRE和JVM

简介: 【7月更文挑战第3天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

前言

Java作为一种跨平台的编程语言,其成功在很大程度上得益于其平台无关性。而这种特性的实现,离不开JDK、JRE和JVM这三个核心组件。本文将详细解析这三者的区别和联系,帮助读者更好地理解Java的运行机制。

摘要

本文将介绍Java开发中常见的三个概念:JDK(Java Development Kit)、JRE(Java Runtime Environment)和JVM(Java Virtual Machine)。我们将探讨它们各自的角色、功能和相互之间的关系,并通过实际案例来展示它们在Java开发和运行中的应用。

简介

在Java的世界里,JDK、JRE和JVM是构建和运行Java程序的基石。理解它们的区别对于Java开发者至关重要。

  • JDK:Java开发工具包,包含了编写Java程序所需的工具和库。
  • JRE:Java运行时环境,包含了运行Java程序所需的最小集合。
  • JVM:Java虚拟机,是一个可以执行Java字节码的虚拟计算机。

源码解析

在介绍三者的区别之前,让我们先看一个简单的Java程序源码:

public class HelloWorld {
   
    public static void main(String[] args) {
   
        System.out.println("Hello, World!");
    }
}

这段代码展示了Java程序的基本结构,但它的编译和运行都依赖于JDK、JRE和JVM。

代码解析

这段代码是一个典型的Java程序,用于演示Java语言的基本结构和语法。它展示了如何使用Java的标准输入输出库来打印一条消息到控制台。下面是对这段代码的详细解析:

// 定义一个公共类名为 HelloWorld
public class HelloWorld {
   
    // 定义 main 方法,它是程序的入口点
    public static void main(String[] args) {
   
        // System.out 是 Java 标准库中System类的一个静态成员,
        // 它关联了标准输出流(通常是控制台)。
        // println 方法是 PrintStream 类的一个方法,用于向控制台打印文本信息,
        // 并在末尾自动添加一个换行符。
        System.out.println("Hello, World!");
    }
}

代码解析

  1. public class HelloWorld:这行代码声明了一个名为HelloWorld的公共类。在Java中,每个应用程序都有一个公共类作为起点,并且这个类名必须与文件名相同。

  2. public static void main(String[] args):这是Java程序的主入口点。main方法必须被声明为公共(public)、静态(static)和返回void类型。String[] args是传递给main方法的参数数组,它可以用来接收从命令行传递给程序的参数。

  3. System.out.println("Hello, World!");:这是main方法中的一条语句,调用了System.out对象的println方法来打印字符串"Hello, World!"到控制台,并在字符串后面自动添加一个换行符。

当这段代码被编译和执行时,它会在控制台输出以下内容:

Hello, World!

这个程序是Java编程的基础示例,展示了如何创建类、编写main方法和使用标准输出。它是学习Java编程的起点,也是大多数Java教程中的第一个示例程序。

案例分析

假设我们需要将上述HelloWorld程序部署到不同的环境:

  • 开发环境中,开发者需要JDK来编译源码。
  • 生产环境中,如果只需要运行程序,部署JRE就足够了。
  • JVM则是无论在哪种环境下,只要运行Java程序,就必须存在的组件。

应用场景案例列举

  • JDK:适用于开发人员编写和编译Java代码。
  • JRE:适用于只需要运行Java程序的服务器或客户端环境。
  • JVM:适用于任何需要执行Java字节码的环境。

优缺点分析

  • JDK:优点是功能全面,适合开发;缺点是体积较大,包含编译器等开发工具。
  • JRE:优点是体积较小,只包含运行Java程序所需的部分;缺点是不支持开发功能。
  • JVM:优点是提供了跨平台的执行环境,确保程序的兼容性;缺点是抽象层的存在可能会带来性能开销。

类代码方法介绍

在Java中,类是对象的模板,方法则是类的行为。在JDK中,java.lang.System类和PrintStream类的println方法被用来实现HelloWorld程序的输出功能。

测试用例

以下是使用main函数编写的简单测试用例,用于验证HelloWorld程序是否能够正确打印信息:

public class HelloWorldTest {
   
    public static void main(String[] args) {
   
        HelloWorld helloWorld = new HelloWorld();
        helloWorld.main(new String[0]); // 直接调用main方法进行测试
    }
}

代码解析

这段Java代码试图创建一个HelloWorld类的实例,并直接调用它的main方法来执行。然而,这种调用方式是不正确的,因为main方法在Java中是一个特殊的入口点,它不能被子类或外部类直接以这种方式调用。下面是对这段代码的分析:

// 定义一个公共类 HelloWorldTest
public class HelloWorldTest {
   
    // main 方法,它是程序的入口点
    public static void main(String[] args) {
   
        // 尝试创建 HelloWorld 类的实例
        HelloWorld helloWorld = new HelloWorld();
        // 错误地尝试直接调用 HelloWorld 实例的 main 方法
        // 这将导致编译错误,因为 main 方法不能这样被调用
        helloWorld.main(new String[0]); // 直接调用main方法进行测试
    }
}

代码解析

  1. public class HelloWorldTest:声明了一个名为HelloWorldTest的新公共类。

  2. public static void main(String[] args):这是HelloWorldTest类中的主方法,它是程序的入口点。

  3. HelloWorld helloWorld = new HelloWorld();:在main方法中创建了HelloWorld类的一个实例。

  4. helloWorld.main(new String[0]);:这行代码尝试直接调用HelloWorld实例的main方法。这是不合法的,因为:

    • main方法在Java中被特别对待,它是由Java运行时环境调用的,而不是由程序内部调用。
    • 没有继承关系的情况下,不能直接调用一个类的成员方法。

正确的测试方法

如果你想测试HelloWorld类,你应该调用它公开的方法,而不是main方法。如果HelloWorld类中有其他可测试的方法,你应该直接调用它们。例如,如果HelloWorld有一个打印消息的方法,你可以这样调用它:

public class HelloWorld {
   
    public void printMessage() {
   
        System.out.println("Hello, World!");
    }
}

public class HelloWorldTest {
   
    public static void main(String[] args) {
   
        HelloWorld helloWorld = new HelloWorld();
        helloWorld.printMessage(); // 正确调用方法进行测试
    }
}

在这个例子中,printMessage是一个公共的实例方法,可以在HelloWorld的实例上直接调用,用以测试其功能。如果HelloWorld类确实需要进行测试,应该编写专门的测试类,使用JUnit或其他测试框架来实现。

总结

本文深入探讨了Java开发中不可或缺的三个组件:JDK、JRE和JVM,它们共同构成了Java程序开发和运行的基础设施。JDK作为开发工具集,为编写和编译Java代码提供了必要的工具;JRE则确保了Java程序能够在不同平台上运行;而JVM则是Java跨平台能力的实现基础,它执行编译后的字节码,确保了程序的可移植性。

通过对HelloWorld程序的源码解析,我们展示了Java程序的典型结构和运行机制。同时,我们也指出了直接调用main方法的错误,并提供了正确的测试方法,强调了在实际开发中遵循Java语言规范的重要性。

此外,本文还讨论了JDK、JRE和JVM的优缺点,指出了它们在不同应用场景下的适用性。JDK的全面性使其成为开发的首选,而JRE的轻量级特点则适合仅需运行Java程序的环境。JVM的跨平台执行环境虽然可能会带来一定的性能开销,但它确保了Java程序的广泛兼容性。

全文小结

在本文中,我们不仅介绍了JDK、JRE和JVM的概念和作用,还通过实际的代码示例和案例分析,帮助读者理解了它们在Java开发中的实际应用。我们强调了正确安装和配置这些组件的重要性,并提供了通俗易懂的解释和分析,以确保读者能够轻松掌握这些关键知识点。

通过本文的学习,读者应该能够独立完成JDK和JRE的安装,正确配置环境变量,并理解JVM在Java程序运行中的核心作用。此外,通过测试用例的编写和分析,我们还展示了如何在实践中应用这些知识,以确保代码的正确性和可靠性。

Java作为一种成熟且广泛使用的编程语言,其开发和运行环境的搭建是每位Java开发者必须掌握的技能。本文旨在为读者提供一个全面、详细且易于理解的指南,帮助他们在Java开发的道路上迈出坚实的一步。随着技术的不断发展,这些基础知识和技能将为读者深入探索Java世界打下坚实的基础。

目录
相关文章
|
8月前
|
安全 Oracle Java
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
592 0
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
|
10月前
|
存储 算法 Java
JvM JDK JRE 三者区别与联系详解
本文深入解析了Java编程中的三个核心概念:JVM(Java虚拟机)、JDK(Java开发工具包)和JRE(Java运行环境)。JVM是执行Java字节码的虚拟计算机,实现“一次编译,到处运行”;JDK包含JRE及开发工具,用于编写和调试Java程序;JRE负责运行已编译的Java程序。文章详细阐述了它们的功能、组成及应用场景,并通过实例说明其在实际开发中的作用,帮助开发者理解三者联系与区别,提升开发效率与问题解决能力。适合Java初学者及进阶开发者学习参考。
1532 3
|
10月前
|
监控 Oracle Java
JVM JDK JRE 使用指南及组件封装方法详解
本指南全面介绍了JVM、JDK、JRE的使用方法与Java组件封装技巧。内容涵盖JDK安装配置、JRE使用、JVM参数调优(如堆内存设置和垃圾回收器选择),以及类、包的封装实践。通过示例展示工具类与数据访问组件的封装方法,并讲解JAR包创建与发布流程。此外,还提供了常见问题解决方案,如内存溢出处理和依赖冲突管理。帮助开发者掌握高效、规范的Java开发技能,提升代码复用性和可维护性。附带面试资料供进一步学习。
400 0
|
11月前
|
Arthas 存储 算法
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
931 55
|
12月前
|
Arthas 监控 Java
Arthas memory(查看 JVM 内存信息)
Arthas memory(查看 JVM 内存信息)
912 6
|
6月前
|
存储 缓存 Java
我们来说一说 JVM 的内存模型
我是小假 期待与你的下一次相遇 ~
480 5
|
6月前
|
存储 缓存 算法
深入理解JVM《JVM内存区域详解 - 世界的基石》
Java代码从编译到执行需经javac编译为.class字节码,再由JVM加载运行。JVM内存分为线程私有(程序计数器、虚拟机栈、本地方法栈)和线程共享(堆、方法区)区域,其中堆是GC主战场,方法区在JDK 8+演变为使用本地内存的元空间,直接内存则用于提升NIO性能,但可能引发OOM。
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
2544 1
|
存储 设计模式 监控
快速定位并优化CPU 与 JVM 内存性能瓶颈
本文介绍了 Java 应用常见的 CPU & JVM 内存热点原因及优化思路。
1250 166
|
存储 缓存 算法
JVM简介—1.Java内存区域
本文详细介绍了Java虚拟机运行时数据区的各个方面,包括其定义、类型(如程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和直接内存)及其作用。文中还探讨了各版本内存区域的变化、直接内存的使用、从线程角度分析Java内存区域、堆与栈的区别、对象创建步骤、对象内存布局及访问定位,并通过实例说明了常见内存溢出问题的原因和表现形式。这些内容帮助开发者深入理解Java内存管理机制,优化应用程序性能并解决潜在的内存问题。
690 29
JVM简介—1.Java内存区域