一、说一下Java的特点
-
平台无关性:这是Java最核心的特点,也叫"一次编写,到处运行"。Java代码编译后生成字节码(.class文件),不是直接编译成机器码,而是由JVM(Java虚拟机)解释执行,只要不同平台(Windows、Linux、Mac)安装了对应版本的JVM,就能运行相同的字节码,不用修改代码。
-
面向对象:Java是纯面向对象编程语言(除了基本数据类型),核心是"万物皆对象",封装、继承、多态三大特性贯穿始终,能让代码更具复用性、扩展性,也更符合人类的思维逻辑。
-
内存管理:Java自带垃圾回收机制(GC),程序员不用手动分配和释放内存,JVM会自动识别并回收不再使用的对象,减少内存泄漏的风险,降低了开发难度,但也意味着程序员对内存的控制能力变弱。
二、Java的优势和劣势是什么
- 优势
<1> 平台无关性:刚才说过,这是Java的"王牌",跨平台能力强,也是企业级开发首选的重要原因(一次开发,多平台部署,降低运维成本)。
<2> 面向对象:封装、继承、多态,让代码结构清晰,易于维护和扩展,适合大型项目开发(比如电商、金融系统)。
<3> 内存管理:GC自动回收内存,减少手动操作,降低内存泄漏、野指针等问题,提升开发效率,降低入门门槛。
<4> 生态成熟:Java发展了20多年,生态极其完善,框架(Spring、SpringBoot、MyBatis)、工具(IDEA、Maven)、类库应有尽有,遇到问题能快速找到解决方案,社区支持强大。
<5> 安全模型:Java有严格的安全机制,比如字节码校验、沙箱机制,能防止恶意代码执行,适合开发企业级安全应用(比如银行系统、支付系统)。
<6> 稳定性:Java的语法严谨,异常处理机制完善,运行过程中不易崩溃,能保证系统长期稳定运行,这也是企业级应用看重的点。
<7> 多线程支持:Java内置多线程相关的类(Thread、Runnable)和锁机制,能轻松实现多任务并发,适合处理高并发场景(比如秒杀、直播)。
- 劣势
<1> 性能劣势:Java代码需要经过"编译成字节码+JVM解释执行",比C、C++等编译型语言慢,虽然JIT(即时编译)能优化,但在极致性能场景(比如操作系统、嵌入式开发)还是不如编译型语言。
<2> 语法繁琐:Java语法比较严格,比如必须写类、必须有main方法(入门程序),相比Python、JavaScript,代码量更多,入门门槛稍高。
<3> 内存消耗:JVM运行需要占用一定的内存,而且GC回收内存时会有一定的开销,相比C语言,Java程序的内存占用更高。
<4> 开发效率:语法繁琐+配置复杂(比如传统SSM框架),相比Python、Go,开发速度较慢,尤其是小型项目,显得有些"笨重"。
三、Java为什么是跨平台的
核心答案:依赖JVM(Java虚拟机)
-
其他语言(比如C语言):代码直接编译成对应平台的机器码,不同平台(Windows、Linux)的机器码格式不同,所以不能跨平台。
-
Java:代码先通过javac编译器编译成字节码(.class文件),字节码不是任何平台的机器码,而是一种"中间代码";然后由对应平台的JVM将字节码解释(或编译)成该平台的机器码,最终执行。
-
关键:JVM是跨平台的核心,不同平台有不同版本的JVM(Windows版JVM、Linux版JVM),但它们都能识别相同的Java字节码,从而实现"一次编写,到处运行"。
一句话总结:Java跨平台的本质,是JVM帮我们屏蔽了不同平台的底层差异,字节码作为中间载体,实现了代码与平台的解耦。
四、JVM,JDK,JRE三者的关系
- JVM(Java Virtual Machine,Java虚拟机):
核心作用:执行Java字节码,是Java跨平台的核心。它不包含任何Java类库,也不能直接运行Java程序(需要依赖类库),只负责将字节码翻译成机器码并执行。
- JRE(Java Runtime Environment,Java运行环境):
核心作用:提供Java程序运行所需的环境。它包含JVM + Java核心类库(比如String、ArrayList等基础类),简单说:有JRE,就能运行已经编译好的Java程序(.class文件),但不能开发、编译Java代码。
- JDK(Java Development Kit,Java开发工具包):
核心作用:提供Java程序的开发、编译、运行环境。它包含JRE + 开发工具(比如javac编译器、java运行工具、jar打包工具等),简单说:有JDK,就能编写、编译、运行Java程序,是程序员必备的工具包。
关系总结(一句话记牢):JDK > JRE > JVM,JDK包含JRE,JRE包含JVM。
五、JVM和Java有什么区别
-
本质不同:Java是一种编程语言 ,有自己的语法规则、关键字、数据类型,是程序员编写代码的"语言";JVM是一种虚拟机,是一个软件,负责执行Java代码编译后的字节码。
-
依赖关系不同:Java代码不能直接运行,必须依赖JVM才能执行;而JVM的核心作用就是支持Java代码的运行,也可以支持其他能生成Java字节码的语言(比如Scala、Kotlin)。
简单类比:Java是"写好的剧本",JVM是"演剧本的演员",没有演员,剧本无法呈现;演员的核心工作,就是把剧本(字节码)转化为观众能看懂的内容(机器码执行结果)。
六、为什么Java解释和编译都有
核心答案:兼顾跨平台和性能
-
解释执行(核心目的:跨平台):Java代码编译后生成字节码,JVM默认会逐行解释字节码,将其转化为机器码执行。这种方式的好处是跨平台性强,只要有JVM,就能解释执行字节码,不用针对不同平台重新编译。
-
编译执行(核心目的:提升性能):解释执行的效率较低,所以Java引入了JIT(即时编译)技术。JIT会监控字节码的执行情况,将频繁执行的代码(热点代码)一次性编译成机器码,并存放在内存中,后续再执行这部分代码时,直接调用机器码,不用再逐行解释,大幅提升运行效率。
总结:Java不是纯解释型语言,也不是纯编译型语言,而是"解释+编译"的混合执行模式,既保证了跨平台性,又兼顾了运行性能,扬长避短。
七、JVM是什么
JVM(Java Virtual Machine,Java虚拟机),是一个虚构的计算机,本质是一个软件,运行在真实的操作系统上。
核心作用有3个:
-
执行字节码:将Java编译后的.class文件(字节码)解释或编译成对应平台的机器码,让Java程序能运行。
-
管理内存:负责Java程序的内存分配、回收(GC垃圾回收),避免内存泄漏。
-
屏蔽平台差异:不同平台的JVM能识别相同的字节码,实现Java的跨平台特性。
补充:JVM只认识字节码,不认识Java源代码,所以Java代码必须先编译成字节码,才能被JVM执行。
八、编译型语言和解释型语言有什么区别
核心区别:是否生成目标平台的机器码,用表格对比更清晰:
- 编译型语言(代表:C、C++)
执行流程:源代码 → 编译器 → 目标平台机器码 → 运行
特点:一次性将所有源代码编译成机器码,后续运行直接执行机器码,运行速度快 ;但编译后的机器码依赖特定平台,不能跨平台,修改代码后需要重新编译。
- 解释型语言(代表:Python、JavaScript)
执行流程:源代码 → 解释器 → 逐行解释成机器码 → 运行
特点:不生成机器码,逐行解释、逐行执行,跨平台性强 (不同平台有对应解释器);但逐行解释需要消耗时间,运行速度慢,修改代码后无需重新编译,直接运行。
补充:Java是混合模式,介于两者之间,既编译(生成字节码),又解释(JVM解释字节码),兼顾跨平台和性能。
九、Python和Java的区别是什么
-
语言类型:Java是静态类型语言 ,变量必须声明类型(比如int a = 10),编译时检查类型错误;Python是动态类型语言,变量不用声明类型(比如a = 10),运行时才检查类型错误。
-
执行效率:Java是"编译+解释"混合执行,运行效率远高于Python(Python是纯解释执行,逐行解释,速度慢)。
-
开发效率:Python语法简洁、代码量少,不用写类、不用声明变量类型,开发速度快;Java语法繁琐、代码量多,开发效率低于Python。
-
应用场景:Java侧重企业级后端开发 (电商、金融、分布式系统)、Android开发;Python侧重数据分析、人工智能、爬虫、自动化测试,也能做后端,但适合小型项目。
-
生态:Java生态侧重企业级开发,框架成熟(Spring、SpringBoot);Python生态侧重数据、AI领域,库丰富(Pandas、TensorFlow)。
十、值传递和引用传递的区别是什么
Java面试重中之重,记住:Java只有值传递,没有引用传递!
- 核心定义:
值传递:传递的是变量的副本(值本身),修改副本的值,不会影响原变量的值。
引用传递:传递的是变量的引用地址,修改引用指向的内容,会影响原变量的值。
- 区别对比:
<1> 传递内容不同:值传递传"副本",引用传递传"地址"。
<2> 对原变量影响不同:值传递修改副本,不影响原变量;引用传递修改地址指向的内容,会影响原变量。
- Java的特殊点:
Java中,基本数据类型(int、char、double等)是值传递;引用数据类型(对象、数组)看似是"引用传递",其实本质还是值传递------传递的是"对象的引用地址的副本"。
举个例子:用方法修改对象的属性,会影响原对象(因为副本地址和原地址指向同一个对象);但用方法修改引用本身(比如重新new一个对象),不会影响原对象(因为副本地址变了,原地址还是指向原来的对象)。