面向对象和⾯向过程的区别
⾯向过程 : ⾯向过程性能⽐⾯向对象⾼。 因为类调⽤时需要实例化,开销⽐较⼤,⽐较消耗资
源,所以当性能是最重要的考量因素的时候,⽐如单⽚机、嵌⼊式开发、 Linux/Unix 等⼀般采
⽤⾯向过程开发。但是, ⾯向过程没有⾯向对象易维护、易复⽤、易扩展。
⾯向对象 : ⾯向对象易维护、易复⽤、易扩展。 因为⾯向对象有封装、继承、多态性的特性,
所以可以设计出低耦合的系统,使系统更加灵活、更加易于维护。但是, ⾯向对象性能⽐⾯向过
程低。
Java 语⾔有哪些特点?
- 简单易学;
- ⾯向对象(封装,继承,多态);
- 平台⽆关性( Java 虚拟机实现平台⽆关性);
- 可靠性;
- 安全性;
- ⽀持多线程( C++ 语⾔没有内置的多线程机制,因此必须调⽤操作系统的多线程功能来进⾏多
线程程序设计,⽽ Java 语⾔却提供了多线程⽀持);7. ⽀持⽹络编程并且很⽅便( Java 语⾔诞⽣本身就是为简化⽹络编程设计的,因此 Java 语⾔不
仅⽀持⽹络编程⽽且很⽅便); - 编译与解释并存;
关于 JVM JDK 和 JRE 最详细通俗的解答
JVM
Java 虚拟机(JVM)是运⾏ Java 字节码的虚拟机。 JVM 有针对不同系统的特定实现(Windows,
Linux, macOS),⽬的是使⽤相同的字节码,它们都会给出相同的结果。
什么是字节码?采⽤字节码的好处是什么?
在 Java 中, JVM 可以理解的代码就叫做 字节码 (即扩展名为 .class 的⽂件),它不⾯向任
何特定的处理器,只⾯向虚拟机。 Java 语⾔通过字节码的⽅式,在⼀定程度上解决了传统解释型语
⾔执⾏效率低的问题,同时⼜保留了解释型语⾔可移植的特点。所以 Java 程序运⾏时⽐较⾼效,
⽽且,由于字节码并不针对⼀种特定的机器,因此, Java 程序⽆须重新编译便可在多种不同操作系
统的计算机上运⾏。
Java 程序从源代码到运⾏⼀般有下⾯ 3 步
我们需要格外注意的是 .classi>机器码 这⼀步。在这⼀步 JVM 类加载器⾸先加载字节码⽂件,然后
通过解释器逐⾏解释执⾏,这种⽅式的执⾏速度会相对⽐较慢。⽽且,有些⽅法和代码块是经常需要被
调⽤的(也就是所谓的热点代码),所以后⾯引进了 JIT 编译器,⽽ JIT 属于运⾏时编译。当 JIT 编
译器完成第⼀次编译后,其会将字节码对应的机器码保存下来,下次可以直接使⽤。⽽我们知道,机器
码的运⾏效率肯定是⾼于 Java 解释器的。这也解释了我们为什么经常会说 Java 是编译与解释共存的
语⾔。
HotSpot 采⽤了惰性评估(Lazy Evaluation)的做法,根据⼆⼋定律,消耗⼤部分系统资源的只有那
⼀⼩部分的代码(热点代码),⽽这也就是 JIT 所需要编译的部分。 JVM 会根据代码每次被执⾏的
情况收集信息并相应地做出⼀些优化,因此执⾏的次数越多,它的速度就越快。 JDK 9 引⼊了⼀种
新的编译模式 AOT(Ahead of Time Compilation),它是直接将字节码编译成机器码,这样就避免了
JIT 预热等各⽅⾯的开销。 JDK ⽀持分层编译和 AOT 协作使⽤。但是 , AOT 编译器的编译质量是
肯定⽐不上 JIT 编译器的。
总结:
Java 虚拟机(JVM)是运⾏ Java 字节码的虚拟机。 JVM 有针对不同系统的特定实现(Windows,
Linux, macOS),⽬的是使⽤相同的字节码,它们都会给出相同的结果。字节码和不同系统的 JVM 实
现是 Java 语⾔“⼀次编译,随处可以运⾏”的关键所在。
JDK 和 JRE
我们需要格外注意的是 .classi>机器码 这⼀步。在这⼀步 JVM 类加载器⾸先加载字节码⽂件,然后
通过解释器逐⾏解释执⾏,这种⽅式的执⾏速度会相对⽐较慢。⽽且,有些⽅法和代码块是经常需要被
调⽤的(也就是所谓的热点代码),所以后⾯引进了 JIT 编译器,⽽ JIT 属于运⾏时编译。当 JIT 编
译器完成第⼀次编译后,其会将字节码对应的机器码保存下来,下次可以直接使⽤。⽽我们知道,机器
码的运⾏效率肯定是⾼于 Java 解释器的。这也解释了我们为什么经常会说 Java 是编译与解释共存的
语⾔。
HotSpot 采⽤了惰性评估(Lazy Evaluation)的做法,根据⼆⼋定律,消耗⼤部分系统资源的只有那
⼀⼩部分的代码(热点代码),⽽这也就是 JIT 所需要编译的部分。 JVM 会根据代码每次被执⾏的
情况收集信息并相应地做出⼀些优化,因此执⾏的次数越多,它的速度就越快。 JDK 9 引⼊了⼀种
新的编译模式 AOT(Ahead of Time Compilation),它是直接将字节码编译成机器码,这样就避免了
JIT 预热等各⽅⾯的开销。 JDK ⽀持分层编译和 AOT 协作使⽤。但是 , AOT 编译器的编译质量是
肯定⽐不上 JIT 编译器的。
总结:
Java 虚拟机(JVM)是运⾏ Java 字节码的虚拟机。 JVM 有针对不同系统的特定实现(Windows,
Linux, macOS),⽬的是使⽤相同的字节码,它们都会给出相同的结果。字节码和不同系统的 JVM 实
现是 Java 语⾔“⼀次编译,随处可以运⾏”的关键所在。
JDK 和 JRE
Oracle JDK 和 OpenJDK 的对⽐
可能在看这个问题之前很多⼈和我⼀样并没有接触和使⽤过 OpenJDK 。那么 Oracle 和 OpenJDK 之间
是否存在重⼤差异?下⾯我通过收集到的⼀些资料,为你解答这个被很多⼈忽视的问题。
对于 Java 7,没什么关键的地⽅。 OpenJDK 项⽬主要基于 Sun 捐赠的 HotSpot 源代码。此外,
OpenJDK 被选为 Java 7 的参考实现,由 Oracle ⼯程师维护。关于 JVM, JDK, JRE 和 OpenJDK 之间
的区别, Oracle 博客帖⼦在 2012 年有⼀个更详细的答案:
问: OpenJDK 存储库中的源代码与⽤于构建 Oracle JDK 的代码之间有什么区别?
答:⾮常接近 - 我们的 Oracle JDK 版本构建过程基于 OpenJDK 7 构建,只添加了⼏个部分,例
如部署代码,其中包括 Oracle 的 Java 插件和 Java WebStart 的实现,以及⼀些封闭的源代码派
对组件,如图形光栅化器,⼀些开源的第三⽅组件,如 Rhino,以及⼀些零碎的东⻄,如附加⽂档
或第三⽅字体。展望未来,我们的⽬的是开源 Oracle JDK 的所有部分,除了我们考虑商业功能的
部分。
总结:
- Oracle JDK ⼤概每 6 个⽉发⼀次主要版本,⽽ OpenJDK 版本⼤概每三个⽉发布⼀次。但这不
是固定的,我觉得了解这个没啥⽤处。详情参⻅: https://blogs.oracle.com/java-platform-g
roup/update-and-faq-on-the-java-se-release-cadence。 - OpenJDK 是⼀个参考模型并且是完全开源的,⽽ Oracle JDK 是 OpenJDK 的⼀个实现,并不是
完全开源的; - Oracle JDK ⽐ OpenJDK 更稳定。 OpenJDK 和 Oracle JDK 的代码⼏乎相同,但 Oracle JDK 有
更多的类和⼀些错误修复。因此,如果您想开发企业/商业软件,我建议您选择 Oracle JDK,因
为它经过了彻底的测试和稳定。某些情况下,有些⼈提到在使⽤ OpenJDK 可能会遇到了许多应
⽤程序崩溃的问题,但是,只需切换到 Oracle JDK 就可以解决问题; - 在响应性和 JVM 性能⽅⾯, Oracle JDK 与 OpenJDK 相⽐提供了更好的性能;
- Oracle JDK 不会为即将发布的版本提供⻓期⽀持,⽤户每次都必须通过更新到最新版本获得⽀
持来获取最新版本; - Oracle JDK 根据⼆进制代码许可协议获得许可,⽽ OpenJDK 根据 GPL v2 许可获得许可。
Java 和 C++的区别?
我知道很多⼈没学过 C++,但是⾯试官就是没事喜欢拿咱们 Java 和 C++ ⽐呀!没办法!!!就算没
学过 C++,也要记下来!
都是⾯向对象的语⾔,都⽀持封装、继承和多态
Java 不提供指针来直接访问内存,程序内存更加安全
Java 的类是单继承的, C++ ⽀持多重继承;虽然 Java 的类不可以多继承,但是接⼝可以多继
承。Java 有⾃动内存管理机制,不需要程序员⼿动释放⽆⽤内存
在 C 语⾔中,字符串或字符数组最后都会有⼀个额外的字符‘\0’来表示结束。但是, Java 语⾔
中没有结束符这⼀概念。
什么是 Java 程序的主类 应⽤程序和⼩程序的主类有何不同?
⼀个程序中可以有多个类,但只能有⼀个类是主类。在 Java 应⽤程序中,这个主类是指包含
main()⽅法的类。⽽在 Java ⼩程序中,这个主类是⼀个继承⾃系统类 JApplet 或 Applet 的⼦
类。应⽤程序的主类不⼀定要求是 public 类,但⼩程序的主类要求必须是 public 类。主类是 Java
程序执⾏的⼊⼝点。
Java 应⽤程序与⼩程序之间有哪些差别?
简单说应⽤程序是从主线程启动(也就是 main() ⽅法)。 applet ⼩程序没有 main() ⽅法,主要
是嵌在浏览器⻚⾯上运⾏(调⽤ init() 或者 run() 来启动),嵌⼊浏览器这点跟 flash 的⼩游戏类
似。
字符型常量和字符串常量的区别?
- 形式上: 字符常量是单引号引起的⼀个字符; 字符串常量是双引号引起的若⼲个字符
- 含义上: 字符常量相当于⼀个整型值( ASCII 值),可以参加表达式运算; 字符串常量代表⼀个地
址值(该字符串在内存中存放位置) - 占内存⼤⼩ 字符常量只占 2 个字节; 字符串常量占若⼲个字节 (注意: char 在 Java 中占两
个字节)