### 前言 这是`推荐学java` 系列的第三篇,这节的内容很多,对于小白来说,都是新概念,要熟练掌握的话,需要大量的练习。本节内容的导图会很大,小编会在讲解每个知识点之前单独提供导图,当然全图也有,除此之外,这节内容会涉及很多系统的API,而我们要学会看 jdk 文档,所以也会给大家提供 jdk1.8 的帮助文档,下载见文末。 ![知识点枝节数目](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/078ec09a86c54da983443ba1dbc1259b~tplv-k3u1fbpfcp-zoom-1.image) 有图有真相就不多说了,知识点基本是上一篇的两倍。 ### 设计模式 ![Java设计模式导图](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1197972f43304cf8b7a13a745b7509a1~tplv-k3u1fbpfcp-zoom-1.image) Java中的 23 种设计模式在开发中应用很多,不仅仅是我们平时的应用开发,还包括一些框架和系统源码中都有应用,具体的内容不能生搬硬套,而是在经验中去体会这个过程,思考应用设计模式的时机和场景。 其中单例设计模式最常用,也最简单,几乎可以说但凡用Java语言开发的程序,都会用到单例设计模式。没有必要死磕概念,重要的是理解其思想,随着开发经验的累积,就会慢慢体悟到其中的奥妙! ```java /** * 懒汉式 */ public class SingletonLazy { private static SingletonLazy singletonHungry; private SingletonLazy() { } public static SingletonLazy getInstance() { if (singletonHungry == null) { singletonHungry = new SingletonLazy(); } return singletonHungry; } } ``` ```java /** * 饿汉式 */ public class SingletonHungry { private static SingletonHungry singletonHungry = new SingletonHungry(); private SingletonHungry() { } public static SingletonHungry getInstance() { return singletonHungry; } } ``` ### 多态 ![Java多态导图](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1b355732cc3e4722808ff4185e670b96~tplv-k3u1fbpfcp-zoom-1.image) `多态` 是 Java 面向对象中的三大特点之一,上一篇中讲了 `封装` 和 `继承` ,多态是本节的第一重点内容。其要表达的意思简而言之:一种事务的多种形态展现形式就叫多态。 抽象起来不好理解,举例实际场景比较好理解: > 比如我们软件开发者本身就是抽象一类,因为其他行业的人理解起来就不容易,而且还分不清楚,你到底是开发啥的?(是前端开发还是后端开发?是Java开发还是PHP开发?是系统层开发还是游戏开发?等等),这个概念总体给人是一种抽象的,但还大概知道这个词具有哪些 **共性** ,而这里的 `共性` 就是抽象出来的具体能力,Java中叫抽象方法,因为每个具体的开发者所具有的同一个方法内部能力表现不同,这就是具体子类要实现的。这里的子类可以理解为 `java开发工程师` 、`PHP开发工程师` 等等。 在我们实际开发中,根据业务场景,我们要自己去提取抽象类,进而实现分离的能力,而所分离出来的多个子类,具有不同的表现形式,就是多种形态的,故名 `多态` 。 #### 关键字 instanceof 相信你能明白,我们抽离出来了抽象类(父类),那么子类的表现各异,而父类如何判断一个子类是否是它的子类呢?这就是关键字 `instanceof` 的用处。 学习多态可能听到最多的一句话就是:**父类引用指向子类对象**。 什么叫**引用**,老版本教材中叫做`句柄`,新点的教程都称为 `引用`,其实就是创建的对象的变量,比如: ```java // programmer 就是句柄,也叫引用 Programmer programmer = new Programmer(); ``` 再举个父类引用指向子类对象的例子: ```java // new 是用来创建对象的,上一节大家都用过 Programmer javaProgrammer = new JavaProgrammer(); ``` #### interface 这块内容大家看导图,记住用法和为什么用。实际开发中,定义接口的场景太多了,必须熟练掌握使用规则。 #### 小结 `多态` 的内容是重中之重,必须搞明白下面这几个概念和为什么?这也是常见的面试题。 1. Java中的多态你是怎么理解的? 2. 你对抽象类怎么理解?抽象类有什么特点? 3. Java为什么会有接口(interface)? 4. 接口的使用规则和接口中方法的定义 5. 内部类的应用场景? ### 异常 ![Java中的异常知识导图](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/64b3c179040f41a483aedadddd2cf60e~tplv-k3u1fbpfcp-zoom-1.image) 这块内容现在开发中依靠 IDE 的只能提示已经可以搞定了,更多的应用情况是自己开发SDK或者封装组件时候的处理,明确出现异常时,程序的执行顺序,以及父类方法抛出异常,子类重写时抛异常的规则。 ### 包装类 ![Java中的包装类知识导图](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5bbed13d0bc2479dbaf49d16e7b2c6df~tplv-k3u1fbpfcp-zoom-1.image) - **明确为什么要有包装类?** - **熟练掌握装箱与拆箱的规则和类型转换方法的使用** 导图中提到的转换方法,开发中经常用到,大家要多练习,最起码基本数据类型要全部尝试一次。 以下代码是本节的重点: ```java private static void compareDemo() { Integer num1 = 20; /** * 相当于执行了 Integer num2 = Integer.valueOf(2021); * * Double 和 Float 不具备这个特性(常量池) */ Integer num2 = 2021; Integer num3 = 20; Integer num4 = 2021; System.out.println("num1 与 20 相等吗 " + (num1 == 20)); // 自动拆箱比较 System.out.println("num2 与 2021 相等吗 " + (num2 == 2021)); /** * 结果不同的原因:Integer在 -128~127 之间时,参与两个 Integer 对象比较前会自动拆箱,超过这个范围则不会 */ System.out.println("num1 与 num3 相等吗 " + (num1 == num3)); // 30 数字在比较 System.out.println("num2 与 num4 相等吗 " + (num2 == num4)); // 对象在比较 } ``` ### 字符串 ![Java中的字符串知识导图](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ee0e88652b624452ae4daca6b9187bd2~tplv-k3u1fbpfcp-zoom-1.image) 这部分内容每个Java开发者必须熟练掌握,字符串的**截取、替换、匹配、大小写转换、查找、拼接**等是最最常用的操作,导图中列出来的方法必须熟练运用。 ### 集合 ![Java中的集合知识导图](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/011a5247b1054dd6ad026817d301fb03~tplv-k3u1fbpfcp-watermark.image) 导图中的重点内容都有标记,是属于重中之重,Java中的集合内容也是面试问的最多的知识点之一,必须牢记于心,熟练运用。`ArrayList` 和 `HashMap` 是开发中最常用到的集合,**必须要明白它们各自的特点和常用方法以及特有方法**,大多数场景是两者结合来使用,比如:条件过滤操作等。 ### 线程 ![Java中的线程知识点导图](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/04f241c324944a8ba833dce4e21dc792~tplv-k3u1fbpfcp-zoom-1.image) 首先要搞清楚程序执行的默认顺序和主线程之间的关系;其次要明白当有多个线程的时候,程序又是如何执行的;这两个问题搞清楚后,你就会明白什么时候需要创建线程了。 知识点(同样是面试题): - **创建线程的方式** - **线程的执行顺序** - **对synchronized关键字的理解** - **线程死锁问题** ### IO ![Java中的IO流知识导图](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/91fc2cb425fe4d89a82ae15cae550dc8~tplv-k3u1fbpfcp-zoom-1.image) 这部分内容实际开发中与网络请求结合使用,比如下载文件、上传文件、修改头像等,这里的具体API使用都是最原生的,也就是底层实现逻辑是这样的,往往实际开发中我们会使用别人封装的框架,看不到最里面的API实现,框架会暴漏给我们一些方法,也许就是一句话就实现了下载或者上传;但是有些场景还是需要我们手动撸一遍,所以这些原理的核心代码还是要掌握,偶尔面试也会让你口述流程。 以下代码是关于 `File` 类创建文件的三种方式,根据业务都有可能会用到: ```java /** * 创建文件 File 的几种方式 * * @param parentPath 前端路径 * @param fileNamePath 后端路径 */ private static void createFile(String parentPath, String fileNamePath) { File file1 = new File(parentPath + "\\" + fileNamePath); System.out.println("file1 is exit ? " + file1.exists()); File file2 = new File(parentPath, fileNamePath); System.out.println("file2 is exit ? " + file2.exists()); File file3 = new File(new File(parentPath), fileNamePath); System.out.println("file3 is exit ? " + file3.exists()); } ``` ### 总结 jdk1.8 帮助文档下载:`https://pan.baidu.com/s/12JHAlmwZbtBiJlPNZPlf3Q` 取密码:d5ya(这个文档是小编从网上下的,里面如有其他内容请勿相信哈) 这三篇内容,对于小白建议15天学完,必须稳扎稳打,这就是Java最基础的东西,不管是后面要接触的多么牛逼的框架,底层都离不开基础的支撑。 **补充内容**:Java中的枚举(Enum) 相对比较简单,自行搜索熟悉写法,后续的项目篇章就会应用。 > 小编特意创建了一个公众号:`推荐学java`,会分享与`java`相关的内容,并且以原创为主,欢迎大家搜索关注(关注即送小编挑选的精品视频教程),一起学Java!