面向对象
面向对象编程(Object-Oriented Programming,OOP
) 实践了软件工程的三个主要目标: 可维护性、可重用性、可扩展性。
面对过程:结构相对松散,强调如何流程化地解决问题。
面对对象:思维更加内聚、强调高内聚、低耦合,先抽象模型,定义共性行为再解决实际问题。
面对对象特征
抽象
抽象是程序员的核心素质之一,体现出程序员对业务的建模能力,以及对架构的宏观掌控力,分为归纳和演绎。
归纳: 从具体到本质,从个性到共性,将一类对象的共同特征进行归一化的逻辑思维过程。
演绎: 从本质到具体,从共性到个性,逐步形象化的过程。
注意:演绎的结果可能是一个抽象结果,并非一定是一个具体的对象或者物体,比如从化合物到食物,从食物到水果,都还在抽象层面上。演绎是在已有问题解决文案的基础上,正确地找到合适的使用场景。
封装
封装是一种对象功能内聚的表现形式,使模块之间耦合度变低,更具有维护性;是在抽象基础上决定信息是否公开,以及公开等级,核心问题是以什么样的方式暴露哪些信息。
抽象是要找到属性和行为的共性,属性是行为的基本生产资料具有一定的敏感性,不能直接对外暴露;封装的主要任务是对属性、数据、部分内部敏感行为实现隐藏。对属性的访问与修改必须通过定义的公共接口来进行,某些敏感方法或者外部不需要感知的复杂逻辑处理,一般也会进行封装。
迪米特法则就是对于封装的具体要求,对依赖的模块的信息知道得尽可能少。属性值的访问与修改需要使用相应的getter/setter
方法,必要时可以在上面进行鉴权控制和日志记录。
建议:在不知道什么样的访问控制权限合适的时候,优先推荐使用 private
控制级别。
继承
继承使子类能够继承父类,获取父类的部分属性和行为,使模块更有复用性,是 is-a
关系,而判断当前的继承关系是否满足is-a
关系的标准是里氏代换原则(Liskov Substitution Principle,LsP
)。
LSP
是指任何父类能够出现的地方,子类都能够出现。在实际代码环境中,如果父类引用直接使用子 类引用来代替,可以编译正确并执行,输出结果符合子类场景的预期,那么说明两个美之间符合 LSP
原则,可以使用继承关系。
滥用的危害
方法污染:父类具备的行为,通过继承传递给子类,子类并不具备执行此行为的能力。
方法爆炸:继承树不断扩大,底层类拥有的方法虽然都可以执行,但是由于方法众多,其中部分方法并非与当前类功能定位相关,造成选择困难。
建议:提供组合优先原则来扩展类的能力,即优先采用组合或聚合的类关系来复用其他类的能力,而不是继承。
多态
多态使模块在复用性基础上更加有扩展性,使系统运行更有想象空间。在运行时根据实际对象类型,同一个方法产生不同的运行结果,即多种不同的表现形式。
Object 类 clone 方法
分为浅拷贝、一般深拷贝和知彻底深拷贝。浅满贝只复制当前对象的所有基本数据类型,以及相应的引用变量,但没有复制引用变量指向的实际对象。而彻底深拷贝是在成功 clone
一个对象之后,此对象与母对象在任何引用路径上都不存在共享的实例对象,一般深拷贝介于两者之间。
注意:慎用 clone
方法来拷贝对象,因为 clone
方法默认是浅拷贝,若想实现深拷贝,则需要覆写 clone
方法实现引用对象的深度遍历式拷贝。
初识 Java
Java 虚拟机
是整个 Java
体系的底层支撑平台,把源文件编译成平台无关的字节码文件,屏蔽 Java
源代码与具体平台的信息,实现跨平台运行。
Java JDK
JDK5
新特性: foreach 迭代方式、可变参数、枚举、自动拆装箱、泛型、注解等。
JDK6
新特性: Desktop 类和 SystemTray 类、使用 Compiler API、轻量级 HttpserVerAP、对脚本语言的支持、 Common Annotations 等。
JDK7
新特性: Switch 支持字符串作为匹配条件、泛型类型自动推断、 try-with-resources 资源关闭技巧、 Objects 工具类、 ForkJoin Pool 等。
JDK8
新特性:接口的默认方法实现与静态方法、 Lambda 表达式、函数式接口方法与构造函数引用、新的日期与时间 API、流式处理等。
JDK9
新特性: Jigsaw 模块化项目、简化进程 API、轻量级 JSON API、钱和货币的 API、进程改善和锁机制优化、代码分段缓存等。
JK10
新特性:局部变量的类型推断、改进 GC 和内存管理、线程本地握手、备用内存设备上的堆分配等重要特性。
JDK11
新特性:删除了 Java ee 和 CORBA 模块,增加基于嵌套的访问控制,支持动态类文 件常量,改进 Aarch64 内联函数,提供实验性质的可扩展的低延迟垃圾收集器 ZGC 等。