JavaSE----------------------------------------------------------------------------------------------
发布时间:2026/10/13 1:46:53 锦皓数字建站

Java基础基础概念与常识Java的优势和劣势Java 是一门面向对象的编程语言优势:跨平台性,丰富的库和框架,稳定性和安全性,强大的社区支持劣势:性能较低,语法较为冗长,启动速度慢。1.JVM vs JDK vs JRE?JVM、JDK 和 JRE 是 Java 编程里很基础且重要的概念。JVM(Java Virtual Machine)运行Java 字节码的虚拟机,它屏蔽了操作系统的差异,让 Java 可以做到一次编写,到处运行。JVM 就像是一个翻译,能把Java 程序编译或解释成对应操作系统能理解的机器语言。比如内存管理、垃圾回收、即时编译(JIT)都在 JVM 里完成JRE(Java Runtime Environment)运行Java 程序所需要的环境,里面包含了JVM和Java 核心类库,有了 JRE,就能运行 Java 程序,但不能编译。JDK(Java Development Kit)提供给开发者的工具包,里面包含了JRE + 开发工具(javac 编译器、调试工具等)。有了 JDK,才能写代码、编译、运行。所以关系就是:JDK ⊃ JRE ⊃ JVM。如果只安装 JVM,本质上只能跑字节码,但没有标准类库,很多程序跑不起来;JRE 解决了运行环境的问题;而 JDK 则是完整的开发环境。JDK中两个最重要的程序:javac编译程序 java执行程序2.什么是字节码?采用字节码的好处是什么?字节码是 Java 等编程语言中一种中间形式的代码。当我们编写好 Java 源代码后,Java 编译器会把这些源代码编译成字节码,字节码文件的扩展名通常是.class。字节码既不是我们编写的高级 Java 代码,也不是计算机能直接执行的机器语言,它是一种通用的中间表示形式,但能方便地被转换成不同计算机能懂的指令。采用字节码有以下几个好处:跨平台性。不同计算机的规则不一样,而字节码是一种与平台无关的中间表示,Java 虚拟机(JVM)可以在不同的平台上把字节码解释或编译成对应平台的机器语言,实现了‘一次编写,到处运行’,极大地提高了开发效率和程序的可移植性。安全性。字节码不是直接的机器语言,它隐藏了程序的底层实现细节,减少了信息泄露的风险。同时,JVM 在加载和执行字节码之前会进行严格的安全检查,防止恶意代码的执行,保障了程序运行的安全性。性能优化。JVM可以根据情况对字节码优化,让程序运行更快。Java 程序从源代码到运行的过程如下图所示:.java: 这是Java 源文件的后缀名。Java 程序员使用 IDE编写 Java 代码,代码文件以.java为扩展名,它是用人类易读的高级编程语言编写的。javac 编译:javac是JDK提供的编译器命令。运行javac命令对.java源文件进行编译,将程序员编写的 Java 代码转换为一种中间形式。.class:编译后生成的文件,其扩展名为.class,这些文件包含的就是字节码。字节码是一种与平台无关的二进制格式,它不是机器能直接执行的代码,但可以被 Java 虚拟机(JVM)识别和处理。解释器 JIT:解释器:在 JVM 中,解释器负责逐行读取并执行字节码。它会将字节码一条一条地转换为机器可理解的指令并执行,这种方式比较灵活,但执行效率相对较低。JIT(Just - In - Time Compiler,即时编译器):为了提高执行效率,JVM 引入了 JIT。JIT 会分析字节码,找出那些被频繁执行的代码段(热点代码),然后将这些热点代码直接编译成机器码,下次执行时就无需再经过解释器解释,从而大大提高了程序的运行速度。机器可理解的代码:经过解释器解释或者 JIT 编译后,最终生成计算机硬件能够直接理解和执行的机器语言代码。计算机:机器可理解的代码在计算机硬件上执行,实现 Java 程序的功能,在终端上呈现运行结果等。3.为什么不全部使用 AOT 呢?AOT(Ahead - Of - Time,提前编译)就是提前把代码编译成机器能直接执行的指令。但我们不全用 AOT,主要有三个原因。一是占空间,AOT 编译后产生的机器码文件很大,占用大量硬盘空间。二是不灵活,程序运行时情况多变,AOT 提前编译好后没办法根据新情况调整。三是时间长,编译大型程序时,AOT 要花很长时间,要是修改代码重新编译,会降低开发效率。4.为什么说 Java 语言“编译与解释并存”?说 Java 语言‘编译与解释并存’是因为 Java 程序的运行有两个关键步骤。首先,Java 代码会通过编译器一次性翻译成字节码,从.java文件变成.class文件,也就是生成字节码,这是编译的过程。然后,Java 虚拟机(JVM)会把字节码一句一句解释成计算机能直接执行的机器指令,让程序得以运行,这是解释的过程。所以 Java 兼具编译和解释两种特性。”5.Oracle JDK vs OpenJDK?Oracle JDK 和 OpenJDK 有以下主要区别:首先,从开源性质上看,OpenJDK 是开源的,意味着它的源代码是公开的,大家可以免费使用,并且能参与到它的开发和改进中。而Oracle JDK 是基于 OpenJDK 开发的商业版本。其次,在支持服务方面,OpenJDK 依靠社区来提供支持,社区里的开发者会共同解决问题,但响应速度和专业性可能参差不齐。Oracle JDK 则有Oracle 公司提供专业的技术支持,能更高效地解决遇到的问题。最后,在使用场景上,OpenJDK 适合个人开发者或者对成本敏感、对技术支持要求不高的项目。而Oracle JDK 更适合大型的商业项目,这些项目需要稳定的性能和可靠的技术支持。”5.1 OpenJDK存储库中的源代码与构建Oracle JDK 的代码之间有什么区别?OpenJDK 存储库中的源代码与构建 Oracle JDK 的代码主要有以下区别:首先,它们有共同的基础。Oracle JDK 的代码是基于 OpenJDK 的,所以大部分核心代码是一样的。其次,Oracle JDK 有特色代码。Oracle 公司会在 OpenJDK 的基础上添加一些自己的代码,这些代码包含了独家的功能、性能优化或,安全增强特性。最后,许可方面有差异。OpenJDK遵循开源许可协议,代码是公开的,开发者可以自由使用、修改和分发。而 Oracle JDK 在商业使用时可能会有不同的许可要求,甚至可能需要付费。”5.2 Oracle JDK这么好,为什么还要有OpenJDK?虽然 Oracle JDK 在性能优化和官方支持方面表现出色,但 OpenJDK 也有其存在的重要意义。首先,从成本角度来看,OpenJDK 是开源免费的,对于一些预算有限的企业或者个人开发者来说,使用 OpenJDK 可以节省大量的费用。企业可以将节省下来的资金投入到其他更重要的业务研发中。其次,在开放性方面,OpenJDK 的代码是公开的,全球的开发者都可以参与到它的开发和维护中。这使得 OpenJDK 能够快速地吸收各方的优秀代码和建议,不断地进行改进和创新。最后,从技术发展的角度来看,OpenJDK 和 Oracle JDK 在很多方面是相互促进的。Oracle JDK 的很多更新和优化也会借鉴 OpenJDK 的成果,而 OpenJDK 也会吸收 Oracle JDK 中的一些优秀特性。两者共同推动了 Java 技术的发展。所以,OpenJDK 的存在丰富了 Java 生态,为不同需求的用户提供了更多的选择。基本语法自己笔记6.标识符和关键字的区别?'A'对应数字65,'a'对应数字97,‘0’对应数字48。在我们编写程序的时候,需要大量地为程序、类、变量、方法等取名字,于是就有了标识符。简单来说,标识符就是一个名字关键字是被赋予特殊含义的标识符。就是Java自己要用到的词。Java 关键字可以按照功能分类:数据类型与定义类相关基本数据类型:byte、short、int、long、float、double、char、boolean。定义类、接口、枚举:class、interface、enum。流程控制相关条件判断:if、else、switch、case、default。循环:for、while、do(先执行一次的循环)、break(跳出循环)、continue(跳过本次循环)、return(返回结果或提前结束方法)。类型判断:instanceof(判断一个对象是不是某个类或者接口的实例)。访问控制与修饰符相关访问控制:public、private、protected。修饰符:static、final、abstract、synchronized(线程同步)、volatile(保证多线程可见性)。类与对象操作相关extends、implements、this、super(父类对象)、new。异常处理相关try(尝试执行代码)、catch(捕获try里出现的异常并处理)、finally(不管try里有没有异常,都会执行)、throw(主动抛出一个异常)、throws(在方法声明处表明这个方法可能会抛出的异常)。包相关 package、import。其他 transient(序列化时忽略该字段)、native(调用本地方法)。虽然true,false,null看起来像关键字,实际上它们是字面值,也不可以作为标识符来使用。7.自增自减运算符?++ 和 -- 运算符可以放在变量之前,也可以放在变量之后。当运算符放在变量之前时,先自增/减,再赋值;当运算符放在变量之后时,先赋值,再自增/减。用一句口诀就是:“符号在前就先加/减,符号在后就后加/减”。自增自减运算符只能用于变量,不能用于常量或者表达式。比如5++或者(a + b)++这样的写法是错误的。int a = 0; int b = a++; // b = 0(先赋值,后自增),a 变成 1 int x = 0; int y = ++x; // y = 1(先自增,后赋值),x 变成 1 // eg1 int[] arr = {10, 20, 30}; int i = 0; System.out.println(arr[i++]); // 输出arr[0](10),然后i变成1 System.out.println(arr[++i]); // i先变成2,再输出arr[2](30) // eg2 int[] nums = {5, 10, 15}; int index = 1; nums[index]++; // nums[1]从10变成11 System.out.println(nums[index]); // 输出11 // eg3 for (int i = 0; i 5; i++) { // for (int i = 0; i 5; ++i) { 与上面写法等效 System.out.print(i + " "); // 输出:0 1 2 3 4 } // eg4 int i = 0; while (i 5) { System.out.print(i++ + " "); // 输出:0 1 2 3 4 } i = 0; while (i 5) { System.out.print(++i + " "); // 输出:1 2 3 4 5 }8.移位运算符移位运算符是对二进制位进行操作的运算符,主要有左移运算符()、右移运算符()和无符号右移运算符()。左移运算符():将一个数的二进制位向左移动指定的位数,右边空出的位用 0 填补。每左移一位,相当于该数乘以 2。例如,3 2,3 的二进制是0000 0011,左移 2 位后变成0000 1100,即 12,相当于 3 乘以 2 的 2 次方。右移运算符():将一个数的二进制位向右移动指定的位数。正数左边空出的位用 0 填补;负数左边空出的位用 1 填补。每右移一位,相当于该数除以 2(取整)。例如,-8 2,-8 的二进制是1111 1000,右移 2 位后变成1111 1110,即 - 2。这里要注意负数右移的结果和直接用除法计算有所不同。无符号右移运算符():无论操作数是正数还是负数,都将二进制位向右移动指定的位数,左边空出的位一律用 0 填补。例如,-8 2,-8 的二进制是1111 1000,无符号右移 2 位后变成0011 1110,即 62。9.⭐️continue、break 和 return 的区别?continue只能用在循环语句中,当程序执行到continue语句时,会跳过本次循环体中剩余的语句,直接开始下一次循环。例如:for (int i = 1; i = 5; i++) { if (i == 3) { continue; // 当i等于3时,continue语句会使Sout(i); 这行代码被跳过,直接进入下一次循环 } System.out.println(i); } // 输出结果是 1、2、4、5break可用于循环语句和switch语句中,当执行到break语句时,会立即终止当前所在的循环或switch语句,跳出相应的代码块。for (int i = 1; i = 5; i++) { if (i == 3) { break; } System.out.println(i); } // 当 i 等于 3 时,break 语句会使整个 for 循环终止,所以输出结果是 1、2return用于方法中,当执行到return语句时,会立即结束当前方法的执行,并将返回值(如果有)返回给调用该方法的地方。public class Main { public static int getSum(int a, int b) { return a + b; // 计算 a 和 b 的和并返回结果 } public static void main(String[] args) { int result = getSum(2, 3); System.out.println(result); } } // return a + b; 语句会计算 a 和 b 的和,并将结果返回给 main 方法中的 result 变量10.⭐️final关键字final、finally、finalize 的区别?可修饰类、方法、变量修饰类:该类被称为最终类,特点是不能被继承了修饰方法:该方法被称为最终方法,特点是不能被重写了修饰变量:该变量只能被赋值一次final 修饰基本类型的变量,变量存储的数据不能被改变final 修饰引用类型的变量,变量存储的地址不能被改变,但地址所指向对象的内容可以被改变使用了static final修饰的成员变量就被称为常量;建议使用大写英文单词,多个单词使用下划线连接。SCHOOL_NAME = “大连理工大学”finally 是 Java 中异常处理的一部分,用来创建 try 块后面的 finally 块。无论 try 块中的代码是否抛出异常,finally 块中的代码总是会被执行。通常,finally 块被用来释放资源,如关闭文件、数据库连接等。finalize 是Object 类的一个方法,用于在垃圾回收器将对象从内存中清除出去之前做一些必要的清理工作。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。