Java基础篇一(认识Java,DOS命令,标识符,关键字,数据类型,变量,常量,类型转换,运算符,程序控制结构) 一、认识Java1.Java的发展历史时间节点核心事件与版本技术/生态意义1991年“Green”项目启动目标是家用电器Java的前身Oak语言诞生为智能家电设计。因市场不成熟项目一度濒临取消。1995年Java 1.0正式发布1996.1.23口号 “Write Once, Run Anywhere” 随互联网兴起而引爆。关键突破Applet 让网页“动”起来。1998年Java 1.2 (J2SE 1.2) 发布J2SE/J2EE/J2ME “三分天下”战略形成确立了从服务器到嵌入式设备的全方位野心。首次引入 Swing GUI工具包和集合框架。2004年J2SE 5.0 (Java 5) 发布语言层面的一次革命性更新。引入泛型、注解、自动装箱/拆箱、枚举、增强for循环、可变参数等深刻改变了Java编码方式。2006年Java SE 6 发布版本命名去“2”J2SE→Java SE。在性能编译器、JVM和桌面脚本引擎、Swing方面大幅增强。同年Sun开源Java形成OpenJDK。2009年Oracle收购Sun以74亿美元完成收购获得Java所有权。此举在社区引发对Java未来开放性的长期担忧。2011年Java SE 7 发布在Oracle治下首个主要版本。引入try-with-resources、NIO.2、钻石操作符、Fork/Join框架等。2014年Java SE 8 (LTS) 发布继Java 5后又一里程碑。Lambda表达式、Stream API、新日期时间API 的引入将Java带入了现代函数式编程的大门。2017年Java SE 9 发布最大特性是引入了备受争议的 JPMS模块化系统Project Jigsaw。同时发布周期改为每六个月一次。2018年Java SE 11 (LTS) 发布重要的LTS版本。HTTP Client API标准化移除Java EE和CORBA模块OpenJDK与Oracle JDK在功能上完全一致但Oracle对商用收费。2021年Java SE 17 (LTS) 发布最新的LTS版本密封类、模式匹配等特性稳定进一步巩固了现代Java语法。社区生态全面转向8/11/17。2023年Java SE 21 (LTS) 发布引入革命性的 虚拟线程旨在显著提升高并发应用的吞吐量和简便性标志着Java并发模型的新时代。1.2 Java的技术体系1.Java SEPlatform Standard Editionjava平台标准版:java技术的基础和核心是标准版的java开发平台。主要用于开发桌面应用程序Java EEJava 2 Platform,Enterprise Editionjava平台企业版用于企业级应用及服务开发的企业版的java平台。开发面向Internet的应用程序 Java WebJava MEJava 2 Platform Micro Editionjava平台微型版为嵌入式电子设备提供的高度优化的微缩版的java平台。开发运行于智能设备的程序1.2.1 关键转折与生态变化“三分天下”战略的兴衰初衷J2SE标准版、J2EE企业版、J2ME微型版旨在覆盖所有计算领域。演变移动互联网时代Android基于Java语法取代了J2ME云原生时代轻量级框架如Spring Boot取代了笨重的J2EE应用服务器。如今“Java EE”已由Eclipse基金会接管并更名为 Jakarta EE。开源与收购控制权的博弈OpenJDK的诞生2006Sun的开源决定是Java保持活力的关键形成了由Oracle、IBM、Red Hat等公司共同维护的生态。Oracle收购的影响Oracle的商业策略如对JDK收取商业支持费直接催生了更多下游发行版的繁荣例如Adoptium/Eclipse Temurin社区主导提供免费、高质量的LTS版本。Amazon Corretto、Microsoft Build of OpenJDK、Alibaba Dragonwell云厂商的优化版本。结论开发者今天应选择 OpenJDK的免费下游发行版而非Oracle的商用JDK除非需要官方的商业支持。现代Java的挑战与革新挑战曾因“臃肿、缓慢”受诟病面临C#、Go、Python等语言的竞争。革新语法现代化从Java 8的Lambda到后续的Records、Pattern Matching语言更简洁。性能飞跃JVM的JIT即时编译、G1/ZGC/Shenandoah等垃圾回收器的演进使性能媲美甚至超越C。并发革命Project Loom 推出的虚拟线程是应对高并发场景的划时代解决方案。云原生适配通过GraalVM 实现原生镜像编译极大减少了启动时间和内存占用完美契合容器化微服务。1.2.2 总结Java历久弥新的核心Java历经近三十年而不衰其核心优势在于跨平台与稳定性JVM“一次编写到处运行”的承诺依然坚固是企业级应用的基石。强大的生态拥有全球最丰富的开源库和框架如Spring生态以及最庞大的开发者社区。持续演进语言和JVM始终保持积极、稳健的现代化步伐。对于开发者的启示是拥抱变化理解原理。掌握Java不再仅仅是学习语法更要理解JVM、现代并发模型和云原生趋势并关注由OpenJDK社区驱动的免费LTS发行版。Java的故事是一部从嵌入式设备出发意外征服互联网进而通过持续自我革新奠定企业级和云原生基础的技术史诗。1.3 Java语言的特点面向对象OOP跨平台操作系统安全性健壮性没有指针操作垃圾自动回收机制多线程分布式Java的设计目标明确“简单、面向对象、分布式、健壮、安全、体系结构中立、可移植、高性能、多线程和动态”。以下特点正是这些目标的具体体现。特点核心解读技术实现/表现面向对象 纯粹的OOP语言除基本类型外。强制以对象和类来组织程序封装、继承、多态是其基石。所有代码都定义在类中。单根继承Object类通过接口实现多继承。跨平台/可移植 “一次编写到处运行”。这是Java最著名的口号也是其成功的核心。JVM是核心。Java源码编译成与平台无关的字节码.class文件由各平台特定的JVM解释/编译执行。健壮性与安全性设计目标之一是构建可靠的、防崩溃的软件。安全性从语言设计和运行时多层次保障。无指针、强类型检查、自动内存管理、异常处理机制、字节码验证、安全管理器。内存自动管理程序员无需手动申请/释放内存由JVM的垃圾回收器自动回收无用对象杜绝内存泄漏但需正确使用。GC算法如分代收集自动在后台运行回收堆内存中不可达的对象。多线程支持语言级内置支持使得并发编程比其他语言如C更简单、更统一。提供 Thread 类、Runnable 接口及 synchronized 关键字以及强大的 java.util.concurrent 并发包。分布式支持适合网络应用开发能够方便地处理TCP/IP协议进行远程方法调用。早期有 RMI现在常通过基于TCP/IP的Web服务如RESTful API实现。网络API是标准库的核心部分。编译与解释结合并非纯解释型语言结合了编译的高性能和解释的灵活性。.java - 编译 - .class字节码 - JVM解释/即时编译 - 机器码。现代JVMHotSpot的JIT编译器是关键。动态性在运行时可以加载新类、获取类型信息、调用方法支持反射和代理。反射API 允许程序在运行时检查或修改其自身的行为这是许多框架如Spring实现的基础。1.3.1 特点背后的权衡与演进1.“没有指针”的真相与代价真相Java有指针但屏蔽了指针的复杂操作。所有对象变量本质上都是引用一种受限制的、安全的指针。你不能直接操作内存地址不能进行指针运算如 p。代价牺牲了部分底层控制的灵活性和极致性能如直接内存操作换来了安全性和开发效率。对于需要底层操作的情况提供了 Unsafe 类慎用或通过JNI调用本地代码。“跨平台”的现代含义与挑战现代含义跨平台已从桌面扩展到服务器、移动端Android、大数据、物联网等全领域。Docker容器化进一步巩固了“一次构建到处运行”。挑战“一次编写到处运行”并非绝对。仍需注意文件路径分隔符、字符编码、字体、特定API等细微差异。GraalVM原生镜像技术正在尝试将Java提前编译为特定平台的可执行文件以牺牲一点“随处”换启动速度和内存开销。“垃圾回收”是双刃剑优势杜绝大部分内存泄漏提升开发效率。复杂性Stop-The-WorldGC时可能导致应用暂停影响实时性。调优复杂需要根据应用特点如高吞吐、低延迟选择并调优GC算法如G1、ZGC、Shenandoah。内存泄漏依然可能如果对象被无意持有如放入静态MapGC无法回收。1.4 Java程序的运行机制1.4.1 JVM与跨平台Java程序不是直接在操作系统之上运行而是运行于JVMjava虚拟机之上。针对不同的操作系统开发相应的JVMJava程序运行于不同的JVM之上因此Java程序可以在不同修改的情况下运行于不同的操作系统之上从而实现了所谓的跨平台。Java源代码.java文件经编译器编译成字节码.class文件字节码文件是计算机可识别的二进制文件JVM本质上就是一个负责解释执行Java字节码的程序。JVM执行Java程序的过程加载.class文件管理并分配内存执行垃圾收集1.4.2 跨平台原理的深度剖析三层抽象模型1 .统一规范层由 《Java虚拟机规范》 和 《Java语言规范》 定义。这是所有JVM和Java编译器都必须遵守的法律文件确保了字节码指令集和核心类库行为的一致性。2. 中间字节码层.class 文件。这是 “Write Once” 的产出物也是JVM的输入。它是平台无关的二进制指令集。3. 本地实现层各厂商为不同操作系统Windows, Linux, macOS和硬件架构x86, ARM开发的 JVM具体实现如HotSpot, OpenJ9。它们负责将统一的字节码“翻译”成本地系统能理解的指令即 “Run Anywhere” 的最终执行者。4.这三层架构确保了Java程序的跨平台能力其具体流程如下图所示关键点真正的“跨平台”指的是字节码跨平台而非源代码。只要目标平台有符合规范的JVM实现同一个 .class 文件就能运行。这正是Java Applet当年能在各种浏览器中运行的原因。1.4.3 JVM的核心职责与内部架构JVM远不止一个“解释器”它是一个完整的微型操作系统负责管理Java程序运行的整个生命周期和资源。核心职责扩展类加载加载 .class 文件其背后是双亲委派模型的类加载器子系统Bootstrap, Extension, Application。内存管理方法区存储类结构、常量、静态变量JDK 8为元空间。堆所有对象实例和数组分配的地方是GC的主要区域。虚拟机栈存储栈帧每个方法调用对应一个栈帧内含局部变量表、操作数栈等。栈内存由系统自动分配释放。程序计数器当前线程执行的字节码行号指示器。本地方法栈为Native方法服务。字节码执行现代JVM如HotSpot采用 “解释器 JIT即时编译器”的混合模式。热点代码被频繁执行的方法会被JIT编译成本地机器码大幅提升性能。垃圾收集自动管理堆内存是Java健壮性的关键。GC需要解决三个核心问题哪些内存需要回收对象是否存活的判定算法引用计数、可达性分析什么时候回收GC触发时机如何回收各种GC算法标记-清除、复制、标记-整理以及对应的收集器Serial, Parallel, CMS, G1, ZGC, Shenandoah。JVM架构总览图为了更好地理解各部分如何协作下图展示了JVM的主要子系统及其关系1.4.4 超越传统现代Java的跨平台演进当前Java生态正在发生重要演进旨在解决传统模型的某些不足挑战启动速度与内存占用传统模型问题JVM需要预热JIT编译需要时间导致短期运行的任务如云函数、CLI工具启动慢、内存开销大。解决方案GraalVM与原生镜像GraalVM一种高性能的通用虚拟机能运行多种语言Java, JavaScript, Python等其核心是新的JIT编译器。Native ImageGraalVM提供的提前编译技术。它将Java字节码、所依赖的库和一个小型的运行时SubstrateVM一起提前编译成独立的、平台相关的原生可执行文件。优势启动速度是毫秒级内存占用极低非常适合云原生和微服务场景。代价编译时间较长运行期失去了部分动态特性如反射、动态类加载需要额外配置。这可以看作是用“一次编译到处运行”的模型对传统“一次编写到处运行”模型的补充和优化。1.4.5 JVMJREJDKJVMJava虚拟机是核心的运行时引擎负责执行字节码。单独一个JVM无法开发或运行大多数Java程序。JREJava RuntimeEnvironmentJava运行时环境JVM类库包含了Java程序运行所需要的JVM及Java核心类库和支持文件但并不包括Java开发工具例如编译器JDK的全称Java Development kit 提供了编译运行Java程序所需的各种工具和资源它包括Java的运行环境、Java开发工具和类库JDK包含JreJre中包含JVm1.5 Java的开发环境1.5.1 Path作用或目的在任意路径下能够直接执行命令1.5.2 环境变量环境变量是用来指定操作系统运行环境的变量Path环境变量指定可执行文件的搜索路径也就是可执行文件在本地的存放路径ClassPath环境变量指定字节码文件的搜索路径OS环境变量操作系统的名字Date环境变量当前日期TIME环境变量当前时间1.5.3配置Java环境变量1.此电脑-属性-高级系统设置-环境变量设置目的原理告诉windows执行Java命令是从哪个本地文件读取运行可执行程序2.环境变量配置好之后便可以在全局实用java命令3.WinR输入cmd 可打开DOS命令窗口输入Javac可检测Java的环境变量是否配置成功1.6 Java代码的编译、加载和运行编写源文件源文件.java使用javac命令编译源文件生成.class文件使用java虚拟机用于解释字节码文件命令运行.class文件输出程序结果编译编译器对源代码的语法进行检查生成字节码文件运行JVM执行变成生成的字节码源文件与class文件在Java中源文件的名称必须是文件中主类的名称扩展名必须为.java。源文件中可以包含多个类但是最多只能有一个类使用public修饰使用public修饰的类就是主类。在Java中源文件还被作为编译单元即一个源文件就是一个编译单元。编译器会为源代码中的每个类生成一个.class文件.class文件的名称是类的名称扩展名为.class。1.7 Main方法方法名只能是main不能是Main等形式。修饰符public static void 三个缺一不可多一个不行参数参数类型为字符串数组 String[]参数名称只要符合Java中标识符命名要求即可参数声明的两种方式String[] args, 或 String args[]1.8 Java的编码规范初学者简版类的命名采用以大写字母开头的大小写字符间隔的方式即大驼峰式命名法。一行只写一条语句块缩进符合每开始一个新块缩进一个制表符对于块状结构 左大括号前不换行 左大括号后换行 右大括号前换行1.9 Java命令javac //后跟文件名称需要包含扩展名.javajavac -d //指明存放字节码文件class文件的位置java //后跟类名javadoc //生成注释文档2、DOS命令E 表示直接进入指定盘符CLS清除屏幕DIR列出目录清单cd 命令cd…回到上级目录cd 指定目录名 可进入指定目录cd \ 返回当前盘符的目录下cd /d E:\workspace 可进行盘符切换并进入到指定目录下 不加/d不能改变盘符3、标识符关键字数据类型3.1 注释注释的三种形式单行注释、多行注释、文档注释文档注释(documentation comment)以“/**”开始以“*/”结束。使用文档注释可以将关于程序的信息嵌入到程序自身中。javadoc命令可以文档注释中的内容提取出来将其放入到一个HTML文件中。文档注释方便了程序的文档化。3.2 分隔符、代码块每行功能代码以 ‘’ 作为结束符号空格没有实际意义可以利用空格无意义将代码合理缩进易读{}包含的代码称之为代码块 例如类if(){}、方法{}、类{}等等3.3 标识符作用标识符是用于给类、方法、变量、包和接口命名的由字母、数字、_和$组成且首字母不能是数字的字符序列。概念Java中类、方法和变量的名称称之为标识符注意事项标识符的长度没有限制Java是大小写敏感的所有标识符区分大小写 main Main不能使用Java的关键字和保留字命名规范英文字母、数字、下划线、美元符号组成首字母不能是数字不能使用Java关键字不能使用true、false和null三个字面量3.4 关键字1.Java保留了const和goto关键字但是没有使用。Java还保留了下面这些关键字true、false和null。这些关键字是Java定义的数值。2.Return 关键字如果方法的返回类型为void可以使用return跳出方法但是不能使用return返回数据。可以用于在方法中进行结果返回3.5 数据类型注意基本数据类型也可以分成两大类数值型、布尔型通俗的理解编写代码的工作包括定义变量保存数据进行处理计算基本类型与引用类型的区别基本类型变量保存实际的数据。引用类型变量不包含实际的数据而是包含实际数据在内存中的位置。3.5.1 基本数据类型整形浮点型字符型1char是16位Java在内部使用16位的整数表示字符Unicode编码char类型的范围065535。//全世界基本的语言符号基本都包含了2char也可以用作整数类型可以将整型字面值赋给char类型的变量可以在char类型上执行算术运算。326个小写字母、26个大写字母、以及10个数字0-9其编码是连续的。布尔型4、 变量和常量变量变量表示存储单元变量名就是存储单元的名称变量初始化之后就可以通过变量名访问存储单元常量声明常量需要使用final关键字量通常在声明时赋值并且赋值之后其值不能改变常量标识符通常全部为大写变量的分类根据变量声明的位置变量可以分为实例变量和局部变量实例变量在类的{}内直接定义的变量称为实例变量或成员变量作用范围整个类中都可以使用实例变量在创建对象时会自动初始化并有初始值(默认值)。基本数据类型皆对应各自的默认初始值引用数据类型默认初始值为Null局部变量在方法中或代码块{}中定义的变量称之为局部变量作用范围直接包含它的{}内有效局部变量不会自动初始化没有默认值使用之前必须要初始化。5、类型转换类型转换是从一种数据类型到另一种数据类型的转换基本数据类型自动类型转换隐式类型转换是指兼容的两种数据类型自动由低级向高级的类型转换 强制类型转换显式类型转换是指高级类型向低级类型的类型转换这种转换可能会损失精度或者溢出引用数据类型向上转型和向下转型基本数据类型和引用数据类型之间自动装箱和自动拆箱6、运算符计算机编程语言用运算符来模拟数学中的运算符号。按操作数数运算符可分类为单目运算符、双目运算符、三目运算符按功能分运算符可分类为赋值运算符、算术运算符、比较运算符、逻辑运算符、位运算符、条件运算符、其他运算符6.1 算数运算符6.1.1 自增和自减运算符自增运算符自减运算符–执行原理i 先自身加1再执行操作 i先执行操作再自身加1注意点案例6.1.2 号作为字符串连接符在实际代码的应用中号如果和字符串类型的数据进行使用表示字符串连接符意指字符串拼接。只要有一个字符串String类型的数据使用号时号就是用于字符串连接。6.2 赋值运算符概念赋值运算符是将右边表达式的运算结果赋值给左侧变量的运算符延伸6.3 比较运算符概念比较运算符是用来判断两个表达式或值大小关系的运算符延伸6.4 逻辑运算符概念逻辑运算符是将逻辑值进行与、或、非操作的运算符延伸6.5 条件运算符概念三目或三元运算符对三个操作数进行操作的运算符语法逻辑表达式 表达式1表达式2执行原理逻辑表达式结果为true时返回表达式1逻辑表达式结果为false时返回表达式2逻辑图6.6 位运算符1.概念位运算符是直接对数值在内存中的二进制位进行操作的运算符2.延伸6.6.1 位运算符的应用有符号数左移有符号数右移无符号数右移6.7 其他运算符7、运算符的优先级8、表达式1.概念表达式是由操作数和运算符组成执行指定计算并返回确定值的式子。9、程序控制结构1.概念程序控制结构式结构化程序设计中用于控制程序执行顺序的逻辑结构2.延伸程序控制结构分为顺序结构选择结构循环结构。9.1 顺序结构顺序结构是在程序中按照指令的先后顺序逐条执行的程序控制结构特点按照代码的先后顺序、依次逐条执行9.2 选择结构概念选择结构是根据条件判断结果决定程序后续执行顺序的程序控制结构分类if选择结构switch选择结构if选择结构分为单分支if判断if-else双分支判断if-else-else if 多分支判断if结构中可以嵌套if选择结果三种if结构可以灵活嵌套和灵活使用。switch选择结构是利用swtich和case进行等值判断的多分支选择结构switch结构和多重if选择结构的对比9.3 循环结构概念循环结构是反复执行一系列指令直到某些特定条件满足的基本程序控制结构。循环结构的三要素循环变量循环条件循环体。循环结构的分类while循环do-while循环for循环。循环结构在具体使用中可以根据实际场景和各自循环的特点进行使用同时在使用时可以使用单一循环结构也可以对循环结构进行组合嵌套使用。9.3.1 while循环特点先判断再执行。代码示意执行逻辑图注意事项使用循环结构时要避免死循环。所谓的死循环就是永远不会提出的循环称为死循环。9.3.2 do-while特点先执行后判断代码示意执行逻辑图while和do-while的区别9.3.3 for循环特点for循环是一种常用于循环次数明确操作的循环结构代码示例9.4 控制结构中的关键字continue在循环结构中用于跳过本次循环break在switch控制结构中break用于跳出switch语句在循环结构中用于跳出循环