温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,汇文网负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
网站客服:3074922707
Java工程师成神之路
基础篇
Java
工程师
基础
关注 Hollis阿里云开发者“藏经阁”一个对 Coding 有着独特追求的人海量免费电子书下载附加说明关于本书关于本书本电子书由和联合出品,书中内容大部分来自作者Hollis 原创,少部分来源于网络的内容均已注明出处。本书为系列的第一部分,该系列共包含基础篇、底层篇、进阶篇、高级篇、架构篇以及扩展篇,共 6 部分。主要迭代的时间点及变更信息如下:主要版本更新时间备注v3.02020-03-31知识体系完善,在 v2.0 的基础上,新增 20%左右的知识点;调整部分知识的顺序及结构,方便阅读和理解;通过 GitHub Page 搭建,便于阅读;v2.02019-02-19结构调整,更适合从入门到精通;进一步完善知识体系;新技术补充;v1.12018-03-12增加新技术知识、完善知识体系v1.02015-08-01首次发布目前正在更新中欢迎大家参与共建关于作者关于作者Hollis,阿里巴巴技术专家,51CTO 专栏作家,CSDN 博客专家,掘金优秀作者,程序员的三门课联合作者,Java 工程师成神之路系列文章作者;热衷于分享计算机编程相关技术,博文全网阅读量数千万。在线阅读地址在线阅读地址GitHub Pages 完整阅读:https:/hollischuang.github.io/toBeTopJavaerGitee Pages 完整阅读:http:/hollischuang.gitee.io/tobetopjavaer版权声明版权声明本着互联网的开放精神,本项目采用开放的GPL协议进行许可,转载请保留本声明及作者信息,禁止用于任何商业用途。参与共建参与共建如果您对本书中的内容有建议或者意见、欢迎提出专业方面的修改建议。您可以直接在GitHub 上以 issue 或者 PR 的形式提出。另外,如果本书中的内容侵犯了您的任何权益,欢迎通过邮箱(hollischuanggmail)与我联系。联系我们联系我们欢迎关注作者的公众号,如果您有任何意见、建议,或者想与作者交流,都可以直接后台留言。如果想要获取如果想要获取JavaJava 工程师成神之路最新版思维导图,请在公众号后台回复工程师成神之路最新版思维导图,请在公众号后台回复:”成神导图成神导图”目录附加说明3面向对象6面向对象与面向过程6面向对象的三大基本特征和五大基本原则8Java 中的封装、继承、多态12什么是平台无关性23Java 中的值传递34Java 语言基础45基本数据类型45Java 中的关键字48String63自动拆/装箱的实现98异常处理122集合类128I/O 流198反射210枚举类型和泛型217动态代理243序列化249注解307单元测试314API&SPI327时间处理330编码方式348语法糖353lambda 表达式372附:Java 基础思维导图374面向对象与面向过程面向对象与面向过程面向对象:创建黑白双方的对象负责演算,棋盘的对象负责画布,规则的对象负责判断,例子可以看出,面向对象更重视不重复造轮子,即创建一次,重复使用。面向过程:开始黑走棋盘判断白走棋盘判断循环。只需要关注每一步怎么实现即可。优劣对比优劣对比面向对象:占用资源相对高,速度相对慢。面向过程:占用资源相对低,速度相对快。面向对象的三大基本特征和五大基本原则面向对象的三大基本特征和五大基本原则最常见的多态就是将子类传入父类参数中,运行时调用父类方法时通过传入的子类决定具体的内部结构或行为。面向对象的五大基本原则面向对象的五大基本原则单一职责原则(单一职责原则(Single-ResponsibilitySingle-Responsibility PrinciplePrinciple)其核心思想为:一个类,最好只做一件事,只有一个引起它的变化。单一职责原则可以看做是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。职责过多,可能引起它变化的原因就越多,这将导致职责依赖,相互之间就产生影响,从而大大损伤其内聚性和耦合度。通常意义下的单一职责,就是指只有一种单一功能,不要为类实现过多的功能点,以保证实体只有一个引起它变化的原因。专注,是一个人优良的品质;同样的,单一也是一个类的优良设计。交杂不清的职责将使得代码看起来特别别扭牵一发而动全身,有失美感和必然导致丑陋的系统错误风险。开放封闭原则(开放封闭原则(Open-ClosedOpen-Closed principleprinciple)其核心思想是:软件实体应该是可扩展的,而不可修改的。也就是,对扩展开放,对修改封闭的。开放封闭原则主要体现在两个方面:1、对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。2、对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对其进行任何尝试的修改。实现开放封闭原则的核心思想就是对抽象编程,而不对具体编程,因为抽象相对稳定。让类依赖于固定的抽象,所以修改就是封闭的;而通过面向对象的继承和多态机制,又可实面向对象的三大基本特征和五大基本原则面向对象与面向过程抽象的稳定性决定了系统的稳定性,因为抽象是不变的,依赖于抽象是面向对象设计的精髓,也是依赖倒置原则的核心。依赖于抽象是一个通用的原则,而某些时候依赖于细节则是在所难免的,必须权衡在抽象和具体之间的取舍,方法不是一层不变的。依赖于抽象,就是对接口编程,不要对实现编程。接口隔离原则(接口隔离原则(Interface-SegregationInterface-Segregation PrinciplePrinciple)其核心思想是:使用多个小的专门的接口,而不要使用一个大的总接口。具体而言,接口隔离原则体现在:接口应该是内聚的,应该避免“胖”接口。一个类对另外一个类的依赖应该建立在最小的接口上,不要强迫依赖不用的方法,这是一种接口污染。接口有效地将细节和抽象隔离,体现了对抽象编程的一切好处,接口隔离强调接口的单一性。而胖接口存在明显的弊端,会导致实现的类型必须完全实现接口的所有方法、属性等;而某些时候,实现类型并非需要所有的接口定义,在设计上这是“浪费”,而且在实施上这会带来潜在的问题,对胖接口的修改将导致一连串的客户端程序需要修改,有时候这是一种灾难。在这种情况下,将胖接口分解为多个特点的定制化方法,使得客户端仅仅依赖于它们的实际调用的方法,从而解除了客户端不会依赖于它们不用的方法。分离的手段主要有以下两种:1、委托分离,通过增加一个新的类型来委托客户的请求,隔离客户和接口的直接依赖,但是会增加系统的开销。2、多重继承分离,通过接口多继承来实现客户的需求,这种方式是较好的。以上就是 5 个基本的面向对象设计原则,它们就像面向对象程序设计中的金科玉律,遵守它们可以使我们的代码更加鲜活,易于复用,易于拓展,灵活优雅。不同的设计模式对应不同的需求,而设计原则则代表永恒的灵魂,需要在实践中时时刻刻地遵守。就如 ARTHUR J.RIEL 在那边OOD 启示录中所说的:“你并不必严格遵守这些原则,违背它们也不会被处以宗教刑罚。但你应当把这些原则看做警铃,若违背了其中的一条,那么警铃就会响起。”Java 中的封装、继承、多态Java 中的封装、继承、多态这样,就实现了多态,同样是 Parent 类的实例,p.call 调用的是 Son 类的实现、p1.call 调用的是 Daughter 的实现。有人说,你自己定义的时候不就已经知道 p 是 son,p1 是 Daughter 了么。但是,有些时候你用到的对象并不都是自己声明的啊。比如 Spring 中的 IOC 出来的对象,你在使用的时候就不知道他是谁,或者说你可以不用关心他是谁。根据具体情况而定。另外,还有一种说法,包括维基百科也说明,多态还分为动态多态和静态多态。上面提到的那种动态绑定认为是动态多态,因为只有在运行期才能知道真正调用的是哪个类的方法。还有一种静态多态,一般认为 Java 中的函数重载是一种静态多态,因为他需要在编译期决定具体调用哪个方法。关于这个动态静态的说法,我更偏向于重载和多态其实是无关的。但是也要看情况,普通场合,我会认为只有方法的重写算是多态,毕竟这是我的观点。但是如果在面试的时候,我“可能”会认为重载也算是多态,毕竟面试官也有他的观点。我会和面试官说:我认为,多态应该是一种运行期特性,Java 中的重写是多态的体现。不过也有人提出重载是一种静态多态的想法,这个问题在 StackOverflow 等网站上有很多人讨论,但是并没有什么定论。我更加倾向于重载不是多态。这样沟通,既能体现出你了解的多,又能表现出你有自己的思维,不是那种别人说什么就是什么的。方法重写与重载方法重写与重载重载(Overloading)和重写(Overriding)是 Java 中两个比较重要的概念。但是对于新手来说也比较容易混淆。本文通过两个简单的例子说明了他们之间的区别。Java 中的封装、继承、多态Java 中的封装、继承、多态public class OverridingTestpublic static void main(String args)Dog dog=new Hound();dog.bark();输出结果:bowl上面的例子中,dog 对象被定义为 Dog 类型。在编译期,编译器会检查 Dog 类中是否有可访问的 bark()方法,只要其中包含 bark()方法,那么就可以编译通过。在运行期,Hound 对象被 new 出来,并赋值给 dog 变量,这时,JVM 是明确的知道 dog 变量指向的其实是 Hound 对象的引用。所以,当 dog 调用 bark()方法的时候,就会调用 Hound类中定义的 bark()方法。这就是所谓的动态多态性。重写的条件重写的条件参数列表必须完全与被重写方法的相同;返回类型必须完全与被重写方法的返回类型相同;访问级别的限制性一定不能比被重写方法的强;访问级别的限制性可以比被重写方法的弱;重写方法一定不能抛出新的检查异常或比被重写的方法声明的检查异常更广泛的检查异常。重写的方法能够抛出更少或更有限的异常(也就是说,被重写的方法声明了异常,但重写的方法可以什么也不声明)。不能重写被标示为 final 的方法。如果不能继承一个方法,则不能重写这个方法。Java 中的封装、继承、多态16重载的重载的例子例子class Dogpublic void bark()System.out.println(woof);/overloading methodpublic void bark(int num)for(int i=0;iJava 中的封装、继承、多态JavaJava 的继承与实现的继承与实现面向对象有三个特征:封装、继承、多态。其中继承和实现都体现了传递性。而且明确定义如下:继承:如果多个类的某个部分的功能相同,那么可以抽象出一个类出来,把他们的相同部分都放到父类里,让他们都继承这个类。实现:如果多个类处理的目标是一样的,但是处理的方法方式不同,那么就定义一个接口,也就是一个标准,让他们的实现这个接口,各自实现自己具体的处理方法来处理那个目标。所以,继承的根本原因是因为要复用,而实现的根本原因是需要定义一个标准。在 Java 中,继承使用 extends 关键字实现,而实现通过 implements 关键字。Java 中支持一个类同时实现多个接口,但是不支持同时继承多个类。简单点说,就是同样是一台汽车,既可以是电动车,也可以是汽油车,也可以是油电混合的,只要实现不同的标准就行了,但是一台车只能属于一个品牌,一个厂商。class Car extends Benz implements GasolineCar,ElectroCar在接口中只能定义全局常量(static final)和无实现的方法(Java 8 以后可以有defult 方法);而在继承中可以定义属性方法,变量,常量等。JavaJava 的继承与组合的继承与组合Java 是一个面向对象的语言。每一个学习