## Java 基础 ### Java 概述 #### Java 语言有哪些特点? - 面向对象(封装,继承,多态); - 平台无关性,具体表现在,Java 是一门“一次编写,到处运行(Write Once,Run any Where)”的编程语言,因此采用 Java 语言编写的程序具有很好的可移植性,Java 之所以能做到这一点的关键因为 Java 虚拟机的存在。在引入 JVM 之后,Java 语言在不同平台上运行不需要再重新编译。 - 可靠性、安全性; - 支持多线程。C++ 没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持; - 支持网络编程并且很方便。Java 语言诞生的起因之一就是为了简化网络编程而设计的; - 编译与解释并存; #### Java 和 C++有什么关系,它们有什么区别? - 都是面向对象的语言,都支持封装、继承和多态; - C++ 支持指针,而 Java 没有指针的概念; - C++ 支持多继承,而 Java 不支持多重继承,但允许一个类实现多个接口; - Java 是完全面向对象的语言,并且还取消了 C/C++ 中的结构和联合,使编译程序更加简洁; - Java 自动进行垃圾回收操作,不再需要程序员手动回收资源,而 C++ 必须由程序释放内存资源,这就增加了程序员的负担。 - Java 不支持操作符重载,操作符重载则被认为是 C++ 的突出特征; - Java 允许预处理,但不支持预处理器功能,所以为了实现预处理,它提供了引入语句(import),但它与 C++ 预处理器的功能类似; - Java 不支持缺省参数函数,而 C++ 支持; - C 和 C++ 不支持字符串变量,在 C 和 C++ 程序中使用“Null”终止符代表字符串的结束。在 Java 中字符串是用类对象(String 和 StringBuffer)来实现的; - goto 语句是 C 和 C++ 的“遗物”,Java 不提供 goto 语句,虽然 Java 指定 goto 作为关键字,但不支持它的使用,这使程序更简洁易读; - Java 不支持 C++ 中的自动强制类型转换,如果需要,必须由程序显式进行强制类型转换。 #### JVM、JRE 和 JDK 的关系是什么? JDK 是 Java Development Kit 的缩写,它是功能齐全的 Java SDK,拥有 JRE 所拥有的一切,还有编译器 javac 和工具,如 javadoc 和 jdb 等命令。JDK 能够创建和编译 Java 程序。 JRE 是 Java Runtime Environment 缩写,它可以运行编译后的 Java 程序。其包括 Java 虚拟机(JVM)、Java 类库、java 命令和其他的一些基础构件。但是,它不能用于创建新程序。 JDK 包含 JRE,JRE 包含 JVM。 ![](http://blog-img.coolsen.cn/img/image-20210219163725268.png) #### **什么是字节码?** >这个问题,面试官可以扩展提问,Java 是编译执行的语言,还是解释执行的语言? Java 之所以可以“一次编译,到处运行”,一是因为 JVM 针对各种操作系统、平台都进行了定制,二是因为无论在什么平台,都可以编译生成固定格式的字节码(.class 文件)供 JVM 使用。因此,也可以看得出字节码对于 Java 生态的重要性。 之所以被称之为字节码,是因为字节码文件由十六进制值组成,而 JVM 以两个十六进制值为一组,即以字节为单位进行读取。在 Java 中一般是用 javac 命令编译源代码为字节码文件,一个.java 文件从编译到运行的示例如图所示。 ![](http://blog-img.coolsen.cn/img/image-20210219165630888.png) #### 采用字节码的好处是什么? Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以 Java 程序运行时比较高效,而且,由于字节码并不专对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同的计算机上运行。 #### Oracle JDK 和 OpenJDK 的区别是什么? 可能在看这个问题之前,很多人和我一样并没有接触和使用过 OpenJDK。下面通过我收集到的一些资料对你解答一下这个容易被忽视的问题。 - Oracle JDK 版本将每三年发布一次,而 OpenJDK 版本每三个月发布一次; - 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 根据 GPLv2 许可获得许可。 GitHub 上标星 7600+ 的开源知识库《二哥的 Java 进阶之路》第一版 PDF 终于来了!包括Java基础语法、数组&字符串、OOP、集合框架、Java IO、异常处理、Java 新特性、网络编程、NIO、并发编程、JVM等等,共计 32 万余字,可以说是通俗易懂、风趣幽默……详情戳:[太赞了,GitHub 上标星 7600+ 的 Java 教程](https://tobebetterjavaer.com/overview/) 微信搜 **沉默王二** 或扫描下方二维码关注二哥的原创公众号沉默王二,回复 **222** 即可免费领取。 ![](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/gongzhonghao.png) ### 基础语法 #### Java 有哪些数据类型? Java 语言的数据类型分为两种:基本数据类型和引用数据类型。 ![](http://blog-img.coolsen.cn/img/image-20210219172725756.png) 1.基本数据类型 包括 boolean(布尔型)、float(单精度浮点型)、char(字符型)、byte(字节型)、short(短整型)、int(整型)、long(长整型)和 double (双精度浮点型)共 8 种,如下表所示。 | 基本类型 | 位数 | 字节 | 默认值 | | -------- | ---- | ---- | ------- | | int | 32 | 4 | 0 | | short | 16 | 2 | 0 | | long | 64 | 8 | 0L | | byte | 8 | 1 | 0 | | char | 16 | 2 | 'u0000' | | float | 32 | 4 | 0f | | double | 64 | 8 | 0d | | boolean | 1 | | false | 对于 boolean,官方文档未明确定义,它依赖于 JVM 厂商的具体实现。逻辑上是占用 1 位,但是实际中会考虑计算机高效存储等因素。 Java 虚拟机规范讲到:在 JVM 中并没有提供 boolean 专用的字节码指令,而 boolean 类型数据在经过编译后会在 JVM 中通过 int 类型来表示,此时 boolean 数据为 4 字节 32 位,而 boolean 数组将会被编码成 Java 虚拟机的 byte 数组,此时每个 boolean 数据为 1 字节占 8bit。 注意: 1. Java 使用 long 类型的数据时一定要在数值后面加上 **L**,否则将作为整型解析: 2. `char a = 'h'`char :单引号,`String a = "hello"` :双引号 2.引用数据类型 建立在基本数据类型的基础上,包括数组、类和接口。引用数据类型是由用户自定义,用来限制其他数据的类型。另外,Java 语言中不支持 C++中的指针类型、结构类型、联合类型和枚举类型。 #### switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上? Java5 以前的 switch(expr) 表达式中,expr 只能是 byte、short、char、int。 从 Java 5 开始,Java 引入了枚举类型, expr 也可以是 enum 类型。 从 Java 7 开始,expr 还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的。 #### **访问修饰符 public、private、protected、以及不写(默认)时的区别**? Java 中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。 - **default** (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。 - **private** : 在同一类内可见。使用对象:变量、方法。 **注意:不能修饰类(外部类)**。 - **public** : 对所有类可见。使用对象:类、接口、变量、方法。 - **protected** : 对同一包内的类和所有子类可见。使用对象:变量、方法。 **注意:不能修饰类(外部类)**。 ![](http://blog-img.coolsen.cn/img/image-20210219173433142.png) #### break,continue,return 的区别及作用? - break **结束当前的循环体** - continue 跳出本次循环,继续执行下次循环(**结束正在执行的循环 进入下一个循环条件**) - return 程序返回,不再执行后面的代码(**结束当前的方法 直接返回**)