java自学01:Java基础知识

简介: java学习记录

面向对象和⾯向过程的区别

⾯向过程 : ⾯向过程性能⽐⾯向对象⾼。 因为类调⽤时需要实例化,开销⽐较⼤,⽐较消耗资
源,所以当性能是最重要的考量因素的时候,⽐如单⽚机、嵌⼊式开发、 Linux/Unix 等⼀般采
⽤⾯向过程开发。但是, ⾯向过程没有⾯向对象易维护、易复⽤、易扩展。
⾯向对象 : ⾯向对象易维护、易复⽤、易扩展。 因为⾯向对象有封装、继承、多态性的特性,
所以可以设计出低耦合的系统,使系统更加灵活、更加易于维护。但是, ⾯向对象性能⽐⾯向过
程低。

Java 语⾔有哪些特点?

  1. 简单易学;
  2. ⾯向对象(封装,继承,多态);
  3. 平台⽆关性( Java 虚拟机实现平台⽆关性);
  4. 可靠性;
  5. 安全性;
  6. ⽀持多线程( C++ 语⾔没有内置的多线程机制,因此必须调⽤操作系统的多线程功能来进⾏多
    线程程序设计,⽽ Java 语⾔却提供了多线程⽀持);7. ⽀持⽹络编程并且很⽅便( Java 语⾔诞⽣本身就是为简化⽹络编程设计的,因此 Java 语⾔不
    仅⽀持⽹络编程⽽且很⽅便);
  7. 编译与解释并存;

关于 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 的所有部分,除了我们考虑商业功能的
部分。

总结:

  1. Oracle JDK ⼤概每 6 个⽉发⼀次主要版本,⽽ OpenJDK 版本⼤概每三个⽉发布⼀次。但这不
    是固定的,我觉得了解这个没啥⽤处。详情参⻅: https://blogs.oracle.com/java-platform-g
    roup/update-and-faq-on-the-java-se-release-cadence。
  2. OpenJDK 是⼀个参考模型并且是完全开源的,⽽ Oracle JDK 是 OpenJDK 的⼀个实现,并不是
    完全开源的;
  3. Oracle JDK ⽐ OpenJDK 更稳定。 OpenJDK 和 Oracle JDK 的代码⼏乎相同,但 Oracle JDK 有
    更多的类和⼀些错误修复。因此,如果您想开发企业/商业软件,我建议您选择 Oracle JDK,因
    为它经过了彻底的测试和稳定。某些情况下,有些⼈提到在使⽤ OpenJDK 可能会遇到了许多应
    ⽤程序崩溃的问题,但是,只需切换到 Oracle JDK 就可以解决问题;
  4. 在响应性和 JVM 性能⽅⾯, Oracle JDK 与 OpenJDK 相⽐提供了更好的性能;
  5. Oracle JDK 不会为即将发布的版本提供⻓期⽀持,⽤户每次都必须通过更新到最新版本获得⽀
    持来获取最新版本;
  6. 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 的⼩游戏类
似。

字符型常量和字符串常量的区别?

  1. 形式上: 字符常量是单引号引起的⼀个字符; 字符串常量是双引号引起的若⼲个字符
  2. 含义上: 字符常量相当于⼀个整型值( ASCII 值),可以参加表达式运算; 字符串常量代表⼀个地
    址值(该字符串在内存中存放位置)
  3. 占内存⼤⼩ 字符常量只占 2 个字节; 字符串常量占若⼲个字节 (注意: char 在 Java 中占两
    个字节)
相关文章
|
23天前
|
Java Linux
java基础(3)安装好JDK后使用javac.exe编译java文件、java.exe运行编译好的类
本文介绍了如何在安装JDK后使用`javac.exe`编译Java文件,以及使用`java.exe`运行编译好的类文件。涵盖了JDK的安装、环境变量配置、编写Java程序、使用命令行编译和运行程序的步骤,并提供了解决中文乱码的方法。
41 1
|
2月前
|
Java 编译器 C++
【Java基础面试一】、为什么Java代码可以实现一次编写、到处运行?
这篇文章解释了Java能够实现“一次编写,到处运行”的原因,主要归功于Java虚拟机(JVM),它能够在不同平台上将Java源代码编译成的字节码转换成对应平台的机器码,实现跨平台运行。
【Java基础面试一】、为什么Java代码可以实现一次编写、到处运行?
|
2月前
|
Java
【Java基础面试四】、介绍一下Java的数据类型
这篇文章介绍了Java的数据类型,包括8种基本数据类型(整数、浮点、字符、布尔)和3类引用数据类型(数组、类、接口),并提供了基本数据类型所占内存空间和数据范围的详细信息。
|
2月前
|
前端开发 Java 编译器
【前端学java】java基础练习缺少项目?看这篇文章就够了!(完结)
【8月更文挑战第11天】java基础练习缺少项目?看这篇文章就够了!(完结)
36 0
|
1月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
268 37
|
1月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
1月前
|
缓存 安全 Java
【Java面试题汇总】Java基础篇——基础、修饰符和关键字(2023版)
Java的特点和优点,、Java 8的新特性、面向对象、基本数据类型和引用类型、自动拆装箱与自动装箱、==与equals()的区别、为什么重写equals()就要重写hashcode()、抽象类和接口的区别、重载和重写的区别、四种引用方式、wt()和sleep()的区别、java方法是值传递还是引用传递?访问修饰符、static、final、this和super、volatile的用法及原理
【Java面试题汇总】Java基础篇——基础、修饰符和关键字(2023版)
|
2天前
|
Java 大数据 程序员
我的程序员之路:自学Java篇
我的程序员之路:自学Java篇
|
2月前
|
Java C++
【Java基础面试十七】、Java为什么是单继承,为什么不能多继承?
这篇文章讨论了Java单继承的设计原因,指出Java不支持多继承主要是为了避免方法名冲突等混淆问题,尽管Java类不能直接继承多个父类,但可以通过接口和继承链实现类似多继承的效果。
【Java基础面试十七】、Java为什么是单继承,为什么不能多继承?
|
2月前
|
Java
【Java基础面试三】、说一说你对Java访问权限的了解
这篇文章介绍了Java中的四种访问权限:private、default(无修饰符时的访问权限)、protected和public,以及它们分别在修饰成员变量/方法和类时的不同访问级别和规则。
【Java基础面试三】、说一说你对Java访问权限的了解