Java基础-概念 📅 2026/8/22 12:39:44 说一下Java的特点主要有以下的特点平台无关性Java的“编写一次运行无处不在”哲学是其最大的特点之一。Java编译器将源代码编译成字节码bytecode该字节码可以在任何安装了Java虚拟机JVM的系统上运行。面向对象Java是一门严格的面向对象编程语言几乎一切都是对象。面向对象编程OOP特性使得代码更易于维护和重用包括类class、对象object、继承inheritance、多态polymorphism、抽象abstraction和封装encapsulation。内存管理Java有自己的垃圾回收机制自动管理内存和回收不再使用的对象。这样开发者不需要手动管理内存从而减少内存泄漏和其他内存相关的问题。Java 的优势和劣势是什么首先Java的优势我记得跨平台应该是一个大点因为JVM的存在一次编写到处运行。然后面向对象这个可能也是优势不过现在很多语言都支持面向对象但是Java的设计从一开始就是OOP的。还有强大的生态系统比如Spring框架Hibernate各种库和工具社区支持大企业应用广泛。另外内存管理方面自动垃圾回收机制减少了内存泄漏的问题对开发者友好。还有多线程支持内置的线程机制方便并发编程。安全性方面Java有安全模型比如沙箱机制适合网络环境。还有稳定性企业级应用长期使用版本更新也比较注重向后兼容。劣势的话性能可能是一个虽然JVM优化了很多但相比C或者Rust这种原生编译语言还是有一定开销。特别是启动时间比如微服务场景下可能不如Go之类的快。语法繁琐比如样板代码多之前没有lambda的时候更麻烦现在有了但比起Python还是不够简洁。内存消耗JVM本身占内存对于资源有限的环境可能不太友好。还有面向对象过于严格有时候写简单程序反而麻烦虽然Java8引入了函数式编程但不如其他语言自然。还有开发效率相比动态语言如PythonJava需要更多代码编译过程也可能拖慢开发节奏。Java为什么是跨平台的Java 能支持跨平台主要依赖于 JVM 关系比较大。JVM也是一个软件不同的平台有不同的版本。我们编写的Java源码编译后会生成一种 .class 文件称为字节码文件。Java虚拟机就是负责将字节码文件翻译成特定平台下的机器码然后运行。也就是说只要在不同平台上安装对应的JVM就可以运行字节码文件运行我们编写的Java程序。而这个过程中我们编写的Java程序没有做任何改变仅仅是通过JVM这一”中间层“就能在不同平台上运行真正实现了”一次编译到处运行“的目的。JVM是一个”桥梁“是一个”中间件“是实现跨平台的关键Java代码首先被编译成字节码文件再由JVM将字节码文件翻译成机器语言从而达到运行Java程序的目的。编译的结果不是生成机器码而是生成字节码字节码不能直接运行必须通过JVM翻译成机器码才能运行。不同平台下编译生成的字节码是一样的但是由JVM翻译成的机器码却不一样。所以运行Java程序必须有JVM的支持因为编译的结果不是机器码必须要经过JVM的再次翻译才能执行。即使你将Java程序打包成可执行文件例如 .exe仍然需要JVM的支持。跨平台的是Java程序不是JVM。JVM是用C/C开发的是编译后的机器码不能跨平台不同平台下需要安装不同版本的JVM。JVM、JDK、JRE三者关系它们之间的关系如下JVM是Java虚拟机是Java程序运行的环境。它负责将Java字节码由Java编译器生成解释或编译成机器码并执行程序。JVM提供了内存管理、垃圾回收、安全性等功能使得Java程序具备跨平台性。JDK是Java开发工具包是开发Java程序所需的工具集合。它包含了JVM、编译器javac、调试器jdb等开发工具以及一系列的类库如Java标准库和开发工具库。JDK提供了开发、编译、调试和运行Java程序所需的全部工具和环境。JRE是Java运行时环境是Java程序运行所需的最小环境。它包含了JVM和一组Java类库用于支持Java程序的执行。JRE不包含开发工具只提供Java程序运行所需的运行环境。JVM 和 Java 有啥区别Java是语言JVM是平台一个是写代码的工具一个是跑代码的环境两者分工不同但相互配合。简单来说Java是一门编程语言就是我们平时写代码用的那个语言像String、List这些都是Java语言提供的。而JVM呢全称是Java虚拟机它是用来运行Java程序的一个平台或者说运行环境。打个比方Java就像是我们写文章用的中文而JVM就像是能够阅读和理解这篇文章的人。我们用Java语言写代码但代码不能直接运行得先通过编译器编译成字节码也就是.class文件然后JVM再把这些字节码翻译成机器能懂的指令去执行。这里面还有一个很关键的点就是Java能够跨平台也就是一次编译到处运行。这个跨平台能力其实主要是JVM提供的。我们写好的Java代码编译成字节码后这份字节码可以在Windows的JVM上运行也可以在Linux的JVM上运行还可以在Mac上运行。虽然底层操作系统不一样但因为有JVM这一层它帮我们屏蔽了这些差异做好了适配。所以本质上是JVM依赖平台但Java字节码不依赖平台。再简单说说它们和其他概念的关系。JDK是开发工具包里面有编译器、调试工具这些也包含了JRE。JRE是运行环境包含了JVM和Java的核心类库。所以关系就是JDK大于JRE大于JVM一个比一个小。如果你要开发Java程序就得装JDK如果只是运行别人写好的程序装个JRE就够了。还有一点JVM其实不只能跑Java。因为JVM执行的是字节码所以像Kotlin、Scala这些语言虽然语法跟Java不一样但编译后也是生成Java字节码一样可以在JVM上运行。所以JVM现在已经不只是Java的专属了而是整个JVM语言生态的基础平台。为什么Java解释和编译都有首先在Java经过编译之后生成字节码文件接下来进入JVM中就有两个步骤编译和解释。 如下图编译Java 源代码会先被 javac 编译为平台无关的字节码.class文件这一步发生在程序运行之前。解释 / JITJVM 启动后由解释器逐条解释执行字节码同时 JVM 通过方法调用计数器和回边计数器识别热点代码达到阈值后由 JIT 编译为本地机器码并缓存到 Code Cache 中后续执行直接走机器码。所以Java既是编译型也是解释性语言默认采用的是解释器和编译器混合的模式。jvm是什么JVM是 java 虚拟机主要工作是解释自己的指令集即字节码并映射到本地的CPU指令集和OS的系统调用。JVM屏蔽了与操作系统平台相关的信息使得Java程序只需要生成在Java虚拟机上运行的目标代码字节码就可在多种平台上不加修改的运行这也是Java能够“一次编译到处运行的”原因。编译型语言和解释型语言的区别编译型语言和解释型语言的区别在于编译型语言在程序执行之前整个源代码会被编译成目标平台的机器码注Java 这种编译为字节码再由虚拟机解释 / JIT 执行的模式严格说属于编译型与解释型的混合生成可执行文件。执行时直接运行编译后的代码速度快但跨平台性较差。解释型语言在程序执行时逐行解释执行源代码不生成独立的可执行文件。通常由解释器动态解释并执行代码跨平台性好但执行速度相对较慢。典型的编译型语言如C、C典型的解释型语言如Python、JavaScript。Python和Java区别是什么Java 是一种编译与解释混合执行的语言源代码先被 javac 编译成字节码.class再由 JVM 加载后通过解释器 JIT 即时编译器执行。Python 是一种解释型语言运行时由解释器逐行翻译并执行源代码CPython 内部也会先编译为字节码 .pyc但整体执行模型仍以解释执行为主。值传递和引用传递的区别在 Java 中参数传递只有值传递一种方式不存在真正的 “引用传递”。但很多人会混淆这两个概念核心区别在于传递的是 “值的副本” 还是 “引用的副本”。值传递Pass by Value。传递的是实际值的副本适用于基本数据类型如 int、char 等修改方法内的参数副本不会影响原变量的值。例子publicstaticvoidmain(String[]args){intnum10;changeValue(num);System.out.println(num);// 输出 10原变量未被修改}publicstaticvoidchangeValue(inta){a20;// 仅修改副本}引用传递的误解本质仍是值传递。对于对象引用类型传递的是对象引用的副本而非对象本身。两个引用原引用和副本指向同一个对象因此通过副本修改对象内部数据会影响原对象。但如果修改副本的指向如重新赋值不会影响原引用的指向。示例publicclassPerson{Stringname;Person(Stringname){this.namename;}}publicstaticvoidmain(String[]args){PersonpnewPerson(Alice);changeName(p);System.out.println(p.name);// 输出 Bob对象内部被修改changeReference(p);System.out.println(p.name);// 仍输出 Bob原引用指向未变}// 修改对象内部数据public static void changeName(Person obj) {obj.nameBob;// 副本和原引用指向同一个对象}// 修改副本的指向不影响原引用public static void changeReference(Person obj) {objnewPerson(Charlie);// 副本指向新对象原引用仍指向旧对象}简单来说Java 中所有参数传递都是值传递基本类型传递 “值的副本”修改副本不影响原值。引用类型传递 “引用的副本”通过副本可修改对象内容但无法改变原引用的指向。