# java_study **Repository Path**: wanxiaoguo/java_study ## Basic Information - **Project Name**: java_study - **Description**: java 学习日志 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-10-17 - **Last Updated**: 2025-03-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 简介 Java语言平台 - **J2SE(Java 2 Platform Standard Edition)** 标准版: Java 平台标准版,Java 编程语言的基础,它包含了支持 Java 应用程序开发和运行的核心类库以及虚拟机等核心组件 - **J2ME(Java 2 Platform Micro Edition)** 小型版: 是为开发电子消费产品和嵌入式设备提供的解决方案 - **J2EE(Java 2 Platform Enterprise Edition)** 企业版: 在 Java SE 的基础上,包含了支持企业级应用程序开发和部署的标准和规范(比如 Servlet、JSP、EJB、JDBC、JPA、JTA、JavaMail、JMS)。 Java EE 可以用于构建分布式、可移植、健壮、可伸缩和安全的服务端 Java 应用程序 Java语言特点: * 简单易学 * 编译与解释并存 * 面向对象(封装,继承,多态) * 分布式 * 健壮性 * 高性能, 通过 Just In Time 编译器等技术的优化 * 可靠性(具备异常处理和自动内存管理机制) * 动态特性: 如反射、动态代理、动态加载、JNI(Java Native Interface) * 安全性: 提供了多重安全防护机制如访问权限修饰符、限制程序直接访问操作系统资源 * Java取消了强大但又危险的指针,而代之以引用 * 只有在满足强制转换规则的情况下才能强转成功 * Java在字节码的传输过程中使用了公开密钥加密机制(PKC) * 字节码校验器 -类装载器 -运行时内存布局 -文件访问限制 * 跨平台/可移植性:JVM * 多线程 Java是目前应用最为广泛的软件开发平台之一。随着Java以及Java社区的不断壮大Java,它更是一个平台、一种文化、一个社区 + **作为一个平台**,Java虚拟机扮演着举足轻重的作用: Groovy、Scala、JRuby、Kotlin等都是Java平台的一部分 + **作为一种文化**,Java几乎成为了“开源”的代名词。第三方开源软件和框架。如Tomcat、MyBatis,Spring, openJDK、Harmony + **作为一个社区**,Java拥有全世界最多的技术拥护者和开源社区支持,有数不清的论坛和资料 Java 可运行程序是由一组 .class 文件打包并压缩成的一个 .jar 文件。Java 解释器负责这些文件的查找、装载和解释 + 其中每个文件允许有一个 public 类,以及任意数量的非 public 类。 + public 类名必须和 .java 文件名完全相同,包括大小写 ## 镜像下载 + [jdk下载](http://www.codebaoku.com/jdk/jdk-index.html) + [华为镜像](https://repo.huaweicloud.com/java/jdk/) # JVM、JRE和JDK + **Java Virtual Machine(JVM)** 就是一个虚拟的用于执行bytecode字节码的”虚拟计算机”。也定义了指令集、寄存器集、结构栈、垃圾收集堆、内存区域。JVM负责将Java字节码解释运行,边解释边运行, 目的是使用相同的字节码,它们都会给出相同的结果 + 不同的操作系统有不同的虚拟机。Java 虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,随处运行” + **Java Runtime Environment(JRE)** 包含:Java虚拟机、库函数、运行Java应用程序所必须的文件 + **Java Development Kit(JDK)** 包含:包含JRE,以及增加编译器和调试器等用于程序开发的文件 ## JDK目录 * `bin`目录:该目录用于存放一些可执行程序 * 如javac.exe(java编译器)、java.exe(java运行工具),jar.exe(打包工具)和* javadoc.exe(文档生成工具)等 * `db`目录:db目录是一个小型的数据库 * 从JDK 6.0开始,Java中引用了一个新的成员JavaDB,这是一个纯Java实现、开源的数据库管理系统。这个数据库不仅轻便,而且支持JDBC 4.0所有的规范,在学习JDBC 时,不再需要额外地安装一个数据库软件,选择直接使用JavaDB即可 * `jre`目录:"jre"是 Java Runtime Environment 的缩写,意为Java程序运行时环境。此目录是Java运行时环境的根目录,它包括Java虚拟机,运行时的类包,Java应用启动器以及一个bin目录,但不包含开发环境中的开发工具 * `include`目录:由于JDK是通过C和C++实现的,因此在启动时需要引入一些C语言的头文件,该目录就是用于存放这些头文件的 * `lib`目录:lib是library的缩写,意为 Java 类库或库文件,是开发工具使用的归档包文件 * `src.zip`文件:src.zip为src文件夹的压缩文件,src中放置的是JDK核心类的源代码,通过该文件可以查看Java基础类的源代码 ### 常见命令 + Javac:Java编译器,将Java源代码转换成字节码。 + javac -encoding UTF-8 HelloWorld.java (错误: 编码GBK的不可映射字符) + Java:Java解释器,直接从类文件执行Java应用程序字节代码。 + appletviewer:小程序浏览器,一种执行HTML文件上的Java小程序的Java浏览器。 + Javadoc:根据Java源码及说明语句生成HTML文档。 + Jdb:Java调试器,可以逐行执行程序,设置断点和检查变量。 + Javah:产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件。 + Javap:Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。 ## 环境变量 + `CLASSPATH`: JVM通过环境变量classpath决定搜索class的路径和顺序(不推荐设置),建议通过`-cp`命令传入 + `JAVA_HOME`: 指向JDK的安装目录 + 修改系统环境变量Path,在最前面追加`%JAVA_HOME%\bin` 并以;和原路径分隔。再增加:`.;`。这是表示当前目录的意思 ![path顺序](img/path_search.jpg) ## 类路径 + JavaSE项目: `/bin/` + JavaWeb项目: `/WEB_INF/classes/` + src:源码包开始的路径,称为类路径的开始,所有源码包里面的东西都会被合并在类路径里面 + conf: 配置文件,文件也会放在bin目录下 + Java项目中的classpath指的是Java项目下的WEB-INF/class,lib。 + 在maven项目中,不光是WEB-INF/class,lib还有src/main/resource。 + WEB-INF/classes目录中存放src目录下Java文件编译好之后的class文件、xml、properties登资源文件,这是一个定位资源的入口 + 引用classpath路径下的文件,只需要在文件名前加`classpath:` + lib和classes同属classpath,两者的访问优先级为`:lib>classes` + `classpath`:只会到你的class路径中查找文件 + `classpath*`:不仅包含class路径,还包括在jar文件中(class路径)进行查找 + 在多个classpath中存在同名资源,都需要加载,那么用classpath:只会加载第一个,这种情况下也需要用`classpath*:`前缀 ![classpath顺序](img/classpath_search.jpg) ## Java两大核心机制 + Java虚拟机(Java Virtual Machine) + 垃圾收集机制 (Garbage Collection) # 常量池 + 全局字符串常量池(**String Pool**):存放的内容是在类加载完成后存到String Pool中的 + 在每个VM中只有一份,存放的是字符串常量的引用值(在堆中生成字符串对象实例) + 在编译期,要求字符串常量池中的常量不能超过65535,并且在javac执行过程中控制了最大值为65534 + class文件常量池(**Class Constant Pool**):class常量池是在编译的时候每个class都有的 + 查看Class文件中常量池: `javap -v HelloWorld.class` + 在编译阶段,存放的是常量(文本字符串、final常量等)和符号引用(类和接口的全限定名、字段的名称和描述符、方法的名称和描述符) + 运行时常量池(**Runtime Constant Pool**):是在类加载完成之后,将每个class常量池中的符号引用值转存到运行时常量池中,也就是说,每个class都有一个运行时常量池,类在解析之后,将符号引用替换成直接引用,与全局常量池中的引用值保持一致 # 参考 + [推荐:Java 全栈知识体系](https://pdai.tech/md/framework/tomcat/tomcat-overview.html) + [JavaGuide](https://github.com/Snailclimb/JavaGuide) + [JavaGuide](https://javaguide.cn/) + [java-tutorial 是一个 Java 教程,汇集一个老司机在 Java 领域的十年积累](https://dunwu.github.io/java-tutorial/) + [Java工程师面试复习指南](https://github.com/h2pl/JavaTutorial) + [一份通俗易懂、风趣幽默的Java学习指南,内容涵盖Java基础、Java并发编程、Java虚拟机、Java企业级开发、Java面试等核心知识点](https://github.com/itwanger/toBeBetterJavaer) + [二哥的Java进阶之路](https://javabetter.cn/) + [包含: Java 基础,面经手册,Netty4.x,手写Spring,用Java实现JVM,重学Java设计模式,SpringBoot中间件开发,IDEA插件开发](https://bugstack.cn/) + [顶尖架构师栈](https://arcstack.top/) ## 书籍推荐