面向对象:是一种编程思想,面向过程是关注实现的步骤,每个步骤定义一个函数,调用函数执行即可。面向对象关注的是谁来执行,把具有相同属性和行为的一类事物进行抽象成类,然后再通过实例化出一个个具体的对象,使用的具体的对象。
类包含:
成员变量(属性)名词
成员方法(行为)动词
构造方法(用来为刚创建的对象的成员进行初始化赋值)
面向对象特征:
封装:
误区:把封装理解成包装了
使用访问权限修饰符把类中的某些属性隐藏起来(private),使外界无法随意访问,只能通过公共方法进行访问,增强了安全性。
继承
子继承父类
可以继承父类中成员(功能),提高代码的复用性
子类可以对父类方法进行重写
多态
同一个事物,在不同时刻表示不同的状态
父类的引用子类的对象
多态提高程序设计的扩展性(在新增功能的时候,只添加新类,尽可能少的修改原来的代码),满足开闭原则,对修改关闭。
接口和抽象类
抽象类:被abstract修饰的类
一个不完整的类(里面包含抽象方法)就可以定义抽象类,一般在类体系结构的顶层类,大多是抽象类。
抽象类特点:
不能实例化对象
其它功能和正常类一样
接口
接口可以理解为是一种特殊的抽象
接口重点在于定义功能(抽象方法),不能定义成员变量,即使定义也只能定义静态常量
接口同样不能被实例化对象,由子类实现,重写其中的抽象方法。
什么时候用抽象类,什么是用接口?
当还需要定义成员变量,构造方法,具体方法时,应该使用抽象类
当只定义功能时,使用接口
单一职责
一个类只负责一件事情。
开闭原则
开闭原则即对修改关闭,对扩展开发在新增功能时,通过扩展一类来实现功能,尽量少的修改之前的代码
接口隔离
把接口粒度更小,把同一类的功能定义到一个接口中,不要把所有的功能定义在一个接口中,这样实现类会继承一些不需要的功能过来
依赖倒置原则
编程实现不应该依赖于底层实现,而是应该依赖于上层的抽象,
先根据实际情况进行分析,设计出接口/抽象类,在抽象层中定义好功能,底层实现根据上层的定义来具体实现即可。
组合聚合复用原则
如果在B类中需要复用A类中的某些方法,除了让B类继承A类外,还可以在B类中关联A类,在B类中依赖A类,只是为了复用某几个方法,使用集成的代价要高一些
里氏替换原则
在使用继承时,在使用父类时,如果将其换成子类,也要保证功能不会受影响。
当子类继承父类后,重写了父类中的方法父类定义为,这时如果把父类替换成子类,那么会影响父类原来的功能
如何避免:如果子类需要重写父类的方法,那么将父类定义为抽象类。
迪米特原则
只跟朋友说话,不和“陌生人说话”
单例模式
单例模式解决一个类在一个项目中只能创建一个对象。
1.单例对象只能有单例类自己创建
饿汉模式:
好处:不存在线程安全问题
不好;启动时创建对象,启动时间会变长
懒汉模式:
package com.ffyc.javapro.thread.fx;public class DCLSingleton {private static volatile DCLSingleton instance; // volatile 保证可见性://确保一个线程修改 instance后,其他线程立即可见最新值// 禁止指令重拍序://new Singleton()的步骤(分配内存→初始化对象→赋值引用)可能被重排序为(分配内存→赋值引用→初始化对象)// 若未初始化完成时其他线程访问 instance,会得到未完全构造的对象private DCLSingleton() {}public static DCLSingleton getInstance() {if (instance == null) { // 第一次检查synchronized (DCLSingleton.class) { // 加锁if (instance == null) { // 第二次检查instance = new DCLSingleton();}}}return instance;}
}
工厂模式
工程模式解决如何大量创建对象
工厂方法:
为每一个具体的产品提供一个专门的工厂,专门负责生产这一具体产品
满足了开闭原则,增加了一个产品,就增加了一个具体产品的生产工厂