java的体系结构

1. 题记:

其实很早就打算来写java的体系结构这一文章,但是有诸多担忧就一直搁置。其一担心自己水平有限,恐不能讲得太透彻,因为java的体系结构宏大精深。其二不知道怎么去把控文章的难度及深度,因为需要给大部分看,不能太晦涩难懂,也不能皮毛一样的粗浅,我想写的是一篇对大部分java开发者来说“难度及深度刚刚好的”的博文。
本篇博文篇幅较长,但我尽力写得通俗易懂,难易适中,由浅入深进而由深入浅,让java结构具象化,从而让其浮出水面,就像我之前博文(图文深入理解java对象从创建到回收都经历了什么,博文地址:https://blog.csdn.net/qq_45732829/article/details/142870192)的那张图一样:
在这里插入图片描述

2. Java体系结构概述

2.1 java语言的整体结构

按照官方的视角,java语言的整体结构如下图所示:
在这里插入图片描述
由图可见,java的这个体系结构还是非常宏大复杂的。但是,Java语言的整体结构非常系统化和模块化,主要包括以下主要部分:

2.1.1 Java语言基础:
  1. 语法:包括变量声明、数据类型(如int、float、char、String等)、运算符、控制结构(如if-else、for、while、switch等)。
  2. 类与对象:Java是一种面向对象的语言,包括类的定义、对象的创建、继承、封装和多态等概念。
  3. 异常处理:Java使用try-catch-finally块来处理运行时错误。
2.1.2 核心库:
  1. Java API:Java提供了丰富的标准库,包括集合框架(如List、Set、Map)、输入/输出(I/O)流、多线程、网络编程、日期和时间处理和数据库JDBC等。
  2. 实用工具类:如String、StringBuilder、Math、System等,提供了许多常用的方法和功能。
2.1.3 Java虚拟机(JVM):

JVM是运行Java字节码的平台,负责将Java字节码转换为特定平台的机器码并执行。包括垃圾回收机制,自动管理内存分配和释放。

2.1.4 Java平台模块系统:

从Java 9开始,Java引入了模块系统(JPMS,Java Platform Module System),用于更好地管理依赖关系和封装代码。

2.1.5 Java EE(Java Enterprise Edition):

针对企业级应用开发的一套规范和技术,包括Servlet、JSP、EJB、JPA、JTA等。提供了构建分布式、多层架构应用所需的组件和服务。

2.1.6 JavaFX:

JavaFX是Java的一个用于构建图形用户界面的框架,支持创建桌面应用。提供了丰富的UI组件和布局管理。

2.1.7 Java ME(Java Micro Edition):

针对嵌入式设备和移动设备的Java平台,这块目前已逐渐被新的技术(如Android等)所取代。

2.1.8 工具与框架:
  1. 开发工具:如Eclipse、IntelliJ IDEA、NetBeans等IDE,提供了编写、调试和部署Java应用的集成环境。
  2. 构建工具:如Maven、Gradle,用于管理项目依赖、构建和部署。
  3. 框架:如Spring、Hibernate、Struts等,简化了企业级应用的开发。
2.1.9 安全与性能:

Java语言内置了多种安全特性,如类加载机制、字节码验证、安全管理器等。
性能优化技术包括JIT(即时编译)、垃圾回收调优、多线程并发控制等。

2.1.10 Java社区与开源:

Java拥有庞大的开发者社区和丰富的开源资源,如Apache、Spring、Oracle等组织和项目。这些组成部分共同构成了Java语言的整体结构,使其成为一个强大、灵活且广泛使用的编程语言。

3. Java体系结构三大块

在这里插入图片描述
如图所示,其实整个java语言的体系结构可以分为三大块,即:java的操作系统环境架构,java语言开发架构以及这java语言的生态。下面分别详细介绍。

3. 1 java的操作系统环境架构

Java操作系统环境主要涉及Java程序的运行和开发所需的环境配置。主要由以下构成:
在这里插入图片描述

3.1.1. Java程序的运行环境
  1. Java虚拟机(JVM):
    JVM是Java程序运行的核心环境,负责将Java字节码转换为特定平台的机器码并执行。JVM屏蔽了不同操作系统之间的差异,使得Java程序具有跨平台性。
  2. Java运行环境(JRE):
    JRE是运行Java程序所必需的环境,包括JVM、核心类库和支持文件。JRE不包含开发工具,仅用于运行Java程序。
3.1.2. Java程序的开发环境
  1. Java开发工具包(JDK):
    JDK是Java开发工具包,包含了JRE以及用于开发Java程序的工具,如编译器(javac)、调试器等。JDK还提供了丰富的类库和API,以及用于构建和管理Java项目的工具(如Maven、Gradle)。
  2. 环境变量配置:
    在安装JDK后,需要配置环境变量以便在命令行中运行Java程序。主要的环境变量包括JAVA_HOME(指向JDK的安装目录)、PATH(包含JVM和JDK工具的路径)和CLASSPATH(指定Java类库的位置)。
  3. 集成开发环境(IDE):
    IDE是开发Java程序的常用工具,提供了代码编辑、调试、构建和部署等功能。常用的Java IDE包括Eclipse、IntelliJ IDEA和NetBeans等。

3. 2 Java 语言开发架构

3.2.1 语法规则
  1. java语法包括标识符、关键字的定义和使用规则。例如,标识符用于给变量、类、方法等命名,要遵循以字母、美元符号($)或下划线(_)开头,后续可跟字母、数字、美元符号或下划线的规则;关键字则是具有特定语法功能的保留字,像public、class等不能用于其他用途。
  2. 数据类型分为基本数据类型(如byte、int、float、char、boolean等)和引用数据类型(如类、接口、数组)。基本数据类型有明确的存储大小和取值范围,而引用数据类型存储的是对象的引用。
    运算符(算术、关系、逻辑、位运算等)和表达式的构成及运算规则。例如,算术运算符用于基本的数学运算,关系运算符用于比较大小等,表达式则是由操作数和运算符组成的式子,运算时要遵循运算符优先级和结合性规则。
3.2.2 程序结构单位
  1. 类是 Java 的基本构建块,它封装了数据(成员变量)和操作数据的方法。例如,一个简单的Person类可以有name和age等成员变量,以及getName、setName等成员方法。
  2. 对象是类的实例,通过new关键字创建。例如,Person person = new Person(“Alice”, 25);创建了一个Person类的对象person,对象可以访问所属类的成员变量和方法。
  3. 方法用于执行特定的操作,有参数(用于接收外部数据)和返回值(用于返回操作结果)。例如,public int add(int a, int b)是一个有两个参数a和b并返回它们之和的方法。
  4. 包用于组织和管理类,避免类名冲突。像java.util包包含许多实用类,通过import语句可以在程序中引入需要的包中的类。
3.2.3 控制结构和异常处理
  1. 控制结构包括顺序结构(语句按书写顺序执行)、选择结构(如if - else、switch - case用于根据条件执行不同代码块)和循环结构(for、while、do - while用于重复执行代码块)。
  2. 异常处理通过try - catch - finally块来实现。try块包含可能抛出异常的代码,catch块捕获并处理特定类型的异常,finally块中的代码无论是否发生异常都会执行。同时,还可以使用throws关键字在方法声明中声明可能抛出的异常。
  3. Java 运行时数据区
    堆是用于存储对象实例的内存区域,所有对象都在堆中分配内存。例如,当创建一个Person对象时,对象的内存空间就在堆中分配。
    栈主要用于存储局部变量和方法调用信息。每当一个方法被调用时,方法的局部变量和执行状态就会被压入栈中,方法执行结束后,相应的栈帧就会弹出。
    方法区存储已被虚拟机加载的类信息、常量、静态变量等。例如,类的字节码、常量池信息都存储在方法区。
    程序计数器用于记录当前线程执行的字节码指令的行号,在多线程环境下,每个线程都有自己独立的程序计数器。

3. 3 Java 应用框架和类库等生态

3.3.1 核心类库
  1. java.lang包是 Java 语言的核心包,提供了基本的类和接口,如Object(所有类的超类)、String(用于处理字符串)、System(提供标准输入输出等功能)等。这些类和接口是 Java 程序最常用的基础组件。
  2. 输入输出相关类库主要集中在java.io和java.nio包中。java.io提供了基于字节流和字符流的输入输出操作,如FileInputStream、FileOutputStream、BufferedReader等;java.nio则提供了更高效的非阻塞式输入输出操作,如ByteBuffer、Channel等相关类。
  3. 集合框架位于java.util包中,包括List(如ArrayList、LinkedList用于存储有序的元素集合)、Set(如HashSet、TreeSet用于存储无序且不重复的元素集合)、Map(如HashMap、TreeMap用于存储键值对)等接口和实现类,方便程序员对数据进行高效的存储和操作。
3.3.2 扩展类库和框架
  1. 用于图形用户界面(GUI)开发的java.awt和javax.swing包。java.awt提供了基本的图形绘制和窗口组件功能,javax.swing是在java.awt基础上构建的更高级的轻量级组件库,用于开发跨平台的图形界面应用程序。
  2. 企业级开发框架如 Java EE(Enterprise Edition),它提供了一系列用于开发企业级应用的技术和规范,包括 Servlet(用于处理 Web 请求)、JSP(Java Server Pages 用于生成动态网页)、EJB(Enterprise Java Beans 用于构建企业级组件)等。这些技术可以帮助开发人员构建大型的、分布式的、安全可靠的企业应用。
  3. 用于数据库访问的java.sql和javax.persistence包。java.sql提供了基本的数据库连接和操作接口,如Connection、Statement、ResultSet等;javax.persistence是 Java 持久化规范,通过如 JPA(Java Persistence API)可以更方便地进行对象 - 关系映射(ORM)操作,将 Java 对象持久化到数据库中。
3.3.3 java生态-Java 开源项目与代码托管平台:
  1. GitHub:
    平台介绍:全球最大最知名的代码托管平台。它拥有庞大的开发者社区和海量的开源项目,几乎涵盖了所有领域和技术方向的 Java 项目。
    热门 Java 开源项目:
    Spring Boot:一个用于快速构建基于 Spring 框架的应用程序的开发框架,大大简化了 Spring 应用的开发过程,在企业级应用开发中广泛使用,其项目地址为https://github.com/spring-projects/spring-boot。
    Elasticsearch:一个强大的开源搜索引擎,基于 Java 编写,用于全文搜索、数据分析等场景,项目地址是https://github.com/elastic/elasticsearch。
    Guava:Google 开发的一组核心库,提供了很多实用的工具类和数据结构,如集合操作、缓存、并发等功能,地址为https://github.com/google/guava。
  2. GitLab:
    平台介绍:也是一个非常受欢迎的代码托管平台,与 GitHub 类似,但它提供了更多的企业级功能和更灵活的权限管理。既可以用于开源项目的托管,也适合企业内部的私有项目开发。
    特点:支持创建私有仓库,对于一些不想公开的 Java 项目开发非常有用。而且它的 CI/CD(持续集成 / 持续部署)功能也很强大,方便开发者进行项目的自动化构建和部署。
  3. 码云(Gitee):
    平台介绍:这是国内最大的代码托管平台之一,由开源中国推出。它提供了稳定的代码托管服务,访问速度较快,适合国内开发者使用。
    特点:对于一些网络访问受限的开发者,码云是一个很好的选择。它也有丰富的 Java 开源项目,比如一些适合国内开发者使用习惯和业务场景的项目。

4. 后记

正如前面所说,java的体系结构是庞大而且复杂的,本博文只是从宏观的角度出发,不深不浅地做了介绍,但对于绝大多数java的开发者来说,理解到这个层次应该是足够了。java体系结构还有最重要的一块就是JVM,这个在我之前的博文也有所涉及,但是只是一部分或者片面。本来也打算写一篇长博文系统深入介绍写JVM,但是没有勇气,害怕自己能力不足。。后面再说吧。

码字不易,宝贵经验分享不易,请各位支持原创,转载注明出处,多多关注作者,家人们的点赞和关注是我笔耕不辍的动力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/465976.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PostgreSQL技术内幕17:PG分区表

文章目录 0.简介1.概念介绍2.分区表技术产生的背景3.分区类型及使用方式4.实现原理4.1 分区表创建4.2 分区表查询4.3 分区表写入4.4 分区表删除 0.简介 本文主要介绍PG中分区表的概念,产生分区表技术的原因,使用方式和其内部实现原理,旨在能…

Ubuntu - 进入紧急模式,无法进入桌面

目录 一、问题 二、分析原因 三、解决 四、参考 一、问题 重新安装VMVare之后,将之前的虚拟机加载不进来 二、分析原因 查看系统错误日志 journalctl -xb | grep Failed mnt挂载找不到了 三、解决 查看系统错误日志 如果是磁盘错误,此时终端会有…

【Spring】——SpringBoot项目创建

阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 引入 一:介绍 二:Spring Boot项目创建 0:项目目录 1&#xff1a…

从0开始搭建一个生产级SpringBoot2.0.X项目(十二)SpringBoot接口SpringSecurity JWT鉴权

前言 最近有个想法想整理一个内容比较完整springboot项目初始化Demo。 SpringBoot接口权限控制 SpringSecurity 接口使用 Bearer token类型 JWT 鉴权 一、pom文件新增依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>s…

Maven 下载配置 详解 我的学习笔记

Maven 下载配置 详解 我的学习笔记 一、Maven 简介二、maven安装配置三、maven基本使用四、idea配置mavenidea配置maven环境maven坐标idea创建maven项目配置Maven-Helper插件 五、依赖管理 一、Maven 简介 Apache Maven 是一个项目管理和构建工具&#xff0c;它基于项目对象模型…

Windows Server2012 R2搭建NFS服务器

正文共&#xff1a;1024 字 23 图&#xff0c;预估阅读时间&#xff1a;1 分钟 在测试vCenter的集群操作时&#xff0c;出现了共享vSAN错误的问题&#xff0c;导致无法继续。我也只好先创建一个共享NFS&#xff08;Network File System&#xff0c;网络文件系统&#xff09;存储…

HarmonyOs DevEco Studio小技巧28--部分鸿蒙生命周期详解

目录 前言 页面和自定义组件生命周期 页面生命周期 onPageShow --- 表示页面已经显示 onPageHide --- 表示页面已经隐藏 onBackPress --- 表示用户点击了返回键 组件生命周期 aboutToAppear --- 表示组件即将出现 onDidBuild --- 表示组件已经构建完成 aboutToDisap…

dolphin 配置data 从文件导入hive

datax 支持多种数据源的相互读写&#xff0c;作为开源软件&#xff0c;提供了离线采集功能&#xff0c;方便系统开发&#xff0c;过程中遇到诸多配置&#xff0c;需要开发者自己探索&#xff0c;免费同样有成本 配置模板 {"setting": {},"job": {"s…

高效管理iPhone存储:苹果手机怎么删除相似照片

在使用iPhone的过程中&#xff0c;我们经常会遇到存储空间不足的问题&#xff0c;尤其是当相册中充满了大量相似照片时。这些照片不仅占用了宝贵的存储空间&#xff0c;还可能使iPhone出现运行卡顿的情况。因此&#xff0c;我们迫切需要寻找苹果手机怎么删除相似照片的方法&…

C++:set详解

文章目录 前言一、set概念介绍二、set的使用1. 插入删除相关2. 查找相关1&#xff09;find2&#xff09;count3&#xff09;lower_bound与upper_bound4&#xff09;equal_range 三、set的值是不能修改的原理四、基于哈希表的set总结 前言 根据应用场景的不同&#xff0c;STL总…

leetcode:杨辉三角

题目链接 class Solution { public:vector<vector<int>> generate(int numRows) {vector<vector<int>> vv(numRows);//生成一个长度为5&#xff0c;元素为vector<int>的顺序表for (int i 0; i < numRows; i)//对生成的顺序表初始化&#xff…

【力扣打卡系列】单调栈

坚持按题型打卡&刷&梳理力扣算法题系列&#xff0c;语言为go&#xff0c;Day20 单调栈 题目描述 解题思路 单调栈 后进先出 记录的数据加在最上面丢掉数据也先从最上面开始 单调性 记录t[i]之前会先把所有小于等于t[i]的数据丢掉&#xff0c;不可能出现上面大下面小的…

二次封装 el-pagination 组件存在的问题

在使用 Element Plus 组件时&#xff0c;有时会遇到组件不完全符合需求的情况&#xff0c;这时可能需要对其进行二次封装。在封装 Pagination 组件时&#xff0c;我们会发现一些属性和函数无法正常使用&#xff0c;下面将详细探讨这些问题&#xff0c;并提供一下思路和想法。 …

通俗易懂讲STM32为GPIO的8种模式(上拉输入、下拉输入、模拟输入、浮空输入,开漏输出,推挽输出)

本文参照这篇博客---易于理解深刻理解GPIO(上拉输入、下拉输入、模拟输入、浮空输入&#xff0c;开漏输出&#xff0c;推挽输出的区别&#xff0c;以STM32为例)_下拉输出-CSDN博客 一、输入模式 上拉输入 一句话总结&#xff1a;接上拉电阻对输入的低电平能够有效的读取&…

单元测试日志打印相关接口及类 Logger

LoggerFactory 简介 单元测试常用日志打印工具LoggerFactory。 LoggerFactory 代码结构 LoggerFactory 是 JUnit 平台中的一个类&#xff0c;用于创建 Logger 实例。它被设计用于提供日志记录功能&#xff0c;使得 JUnit 在执行测试时能够记录信息、警告、错误等。 LoggerFact…

【万字总结】数据结构常考应用大题做法画法详解_树_哈希表_图_排序大总结

文章目录 1.树相关应用大题1.1 已知二叉树的中序序列和前序or中序&#xff0c;画出二叉树1.2 二叉树的遍历、树的遍历、森林的遍历总结1.3二叉树与森林之间的转换1.3.1 已知树的先序序列和中序序列&#xff0c;画出森林 1.4 二叉树的线索化1.5 二叉排序树1.5.1 二叉排序树的删除…

越权访问漏洞

V2Board Admin.php 越权访问漏洞 ## 漏洞描述 V2board面板 Admin.php 存在越权访问漏洞&#xff0c;由于部分鉴权代码于v1.6.1版本进行了修改&#xff0c;鉴权方式变为从Redis中获取缓存判定是否存在可以调用… V2Board Admin.php 越权访问漏洞 漏洞描述 V2board面板 Admin.ph…

接口测试用例设计的关键步骤与技巧解析!

简介 接口测试在需求分析完成之后&#xff0c;即可设计对应的接口测试用例&#xff0c;然后根据用例进行接口测试。接口测试用例的设计也需要用到黑盒测试用例设计方法&#xff0c;和测试流程与理论章节的功能测试用例设计的方法类似&#xff0c;设计过程中还需要增加与接口特…

Redis常见面试题(二)

Redis性能优化 Redis性能测试 阿里Redis性能优化 使用批量操作减少网络传输 Redis命令执行步骤&#xff1a;1、发送命令&#xff1b;2、命令排队&#xff1b;3、命令执行&#xff1b;4、返回结果。其中 1 与 4 消耗时间 --> Round Trip Time&#xff08;RTT&#xff0c;…

功能超全的客服快捷回复软件

客服日常工作繁忙&#xff0c;需要一款满足各项日常需求的客服工具&#xff0c;完成咨询的快捷回复&#xff0c;并能共享客服团队优质话术&#xff0c;实现云端文件储存&#xff0c;管理表情动图等功能 前言 客服日常工作繁忙&#xff0c;需要一款满足各项日常需求的客服工具。…