javase.md 9.0 KB
Newer Older
沉默王二's avatar
书籍  
沉默王二 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
## 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 许可获得许可。

沉默王二's avatar
7600+  
沉默王二 已提交
68
GitHub 上标星 7600+ 的开源知识库《二哥的 Java 进阶之路》第一版 PDF 终于来了!包括Java基础语法、数组&字符串、OOP、集合框架、Java IO、异常处理、Java 新特性、网络编程、NIO、并发编程、JVM等等,共计 32 万余字,可以说是通俗易懂、风趣幽默……详情戳:[太赞了,GitHub 上标星 7600+ 的 Java 教程](https://tobebetterjavaer.com/overview/)
沉默王二's avatar
书籍  
沉默王二 已提交
69

沉默王二's avatar
沉默王二 已提交
70 71

微信搜 **沉默王二** 或扫描下方二维码关注二哥的原创公众号沉默王二,回复 **222** 即可免费领取。
沉默王二's avatar
书籍  
沉默王二 已提交
72

沉默王二's avatar
沉默王二 已提交
73
![](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/gongzhonghao.png)
沉默王二's avatar
书籍  
沉默王二 已提交
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
    

### 基础语法

#### 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 程序返回,不再执行后面的代码(**结束当前的方法 直接返回**)