1. 面向对象
1.1 多态
1.1.1 软件设计六大原则
1 单一职责原则
原则思想 : 一个方法只做一件事,一个类只负责一个职责,这样当前职责改动,不会对其他程序产生影响
常识原则,几乎所有程序员都会遵循这个原则
优点 : 降低类和类之间的耦合度,提高可读性,可维护性,可扩展性,降低可变性的风险
2 里氏替换原则
原则思想 : 能使用父类的地方,就一定可以使用子类
子类还可以扩展父类的功能,但是不能更改父类的功能,并且子类还可以有自己特有的功能
优点 : 增加了程序的健壮性,即使有了新的子类,原子类不受影响,可以正常执行
3 依赖倒置原则
原则思想 : 高层次不应该依赖低层次,都应该依赖于抽象
优点 : 拥抱多种变化,可以减少需求变化带来的工作量
4 接口隔离原则
原则思想 : 类和接口之间应该建立在最小接口上
5 迪米特法则
原则思想 : 又称为最少知识原则,一个对象尽可能的少了解其他对象
一个类中尽量减少对其他类的依赖
6 开闭原则
原则思想 : 对修改关闭,对扩展开放
尽量通过扩展软件实体来解决需求的变化,而不是通过修改已有的代码来完成变化
1.1.2 是什么
什么是多态:
多态就是里氏替换原则的一种体现
能使用父类的地方就一定可以使用子类
多态 就是 父类引用指向子类对象
父类引用:使用父类类型 创建的引用类型变量
指向:通过这个引用可以找到谁
通过父类创建的一个引用类型变量 ,找到了子类的对象
父类类型 变量名 = new 子类();
Animal a = new Cat();多态
1.1.3 怎么用
多态的几种形式:
1 直接多态: 父类 变量 = new 子类();
2 形参/实参: 参数列表用父类声明,调用方法 传递子类对象
3 返回值多态: 返回值类型是父类类型,但返回的对象 是子类对象
1.1.4 为什么这么用(优点)
1.1.5 缺点
丢失子类特有的属性
1.1.6 向下转型
多态:又叫向上转型
子类到父类 是向上
父类到子类 是向下
想要向下转型 必须先发生向上转型
1.1.7 多态属性调用
多态进行属性调用:
1.父类没有的,都调用不了(因为多态缺点,丢失子类特有的属性)
2.父类有的,子类没有的, 执行父类
3.父类和子类都有,除了成员方法执行子类,其他全部执行父类(因为只有成员方法可以覆写)
1.1.8 比较隐秘的多态
this保存的是子类的内存地址,因为用哪个对象调用的这个方法,this就指向谁
this是对象中第一个成员变量保存当前对象的内存地址
既然是变量肯定有类型,可以保存当前类对象的类型有
1当前类类型(this所在的类就是当前类)
2父类类型(多态缺点:丢失子类特有的属性)
而this可以调用当前类中特有的属性所以this的类型应该是当前类类型
this在哪个类哪个类就是当前类而现在这个程序this在Sup_04类中
所以就等于是Sup_04 this;
而谁调用的这个方法this就指向谁这个m1方法最终是由new Sub_04()调用的.所以this指向new Sub_ 04()
相当于: Sup_04 this = new Sub__04();
总结:通过子类,调用父类的方法的时候此时父类这个方法中的上下文环境就是多态环境
1.2 抽象
1.2.1 概述
抽象:抽象类往往表示设计中得出的抽象概念
比如动物,它只是一一个抽象的概念并没有具体的一个东西叫动物,所以它并不能代表-一个实体
这种情况下我们就适合把他作为一一个抽象类
比如Animal表示所有动物,但是没有一个具体东西叫动物,
它可以作为所有动物的祖类,可以把所有动物共有的属性和行为保存到Animal中
然后再有Cat , Dog之类的具体的动物类,都继承Animal类并且Cat还具有他们特有的属性
那么此时Cat表示猫,而一个Cat对象就表示具体的某一个猫
但是Animal不应该有对象因为没有一个东西是叫动物,动物是-一个统称
那么此时Animal就适合作为抽象类
abstract :修饰符修饰的类是抽象类,修饰的成员方法是抽象方法
抽象方法 :使用abstract修饰的成员方法并且该方法没有方法体,就是没有大括号
抽象类:不能被实例化,只能用于被继承
abstract :修饰符修饰的类是抽象类修饰的成员方法是抽象方法
抽象方法:使用abstract修饰的成员方法,并且该方法没有方法体,就是没有大括号
抽象类:不能被实例化只能用于被继承
-般抽象类中,有功能的定义,但是没有功能的实现要求必须让子类覆写
比如我们的Animal和Cat使用多态可以降低耦合度但是Animal中,只需要有move的方法不需要有具体的实现
因为具体实现应该由Cat实现但是Animal中还必须得有,要么多态使用不了,丢失子类特有的属性
但是如果Animal中写了move方法,那么子类中覆写不覆写都可以根本没办法强制要求
这个时候可以再Animal中编写-个抽象方法但是抽象方法必须要在抽象类中的
所以继承这个抽象类之后,必须要实现抽象类中的所有抽象方法
实现:子类对抽象方法加上方法体完成功能实现
含有抽象方法的类型-一定是抽象类正确
抽象类中-定含有抽象方法错误
抽象类和普通类几乎完全一样,只有两点不同
1不能创建对象
2可以有抽象方法
非抽象类继承抽象类必须实现所有的抽象方法
抽象类继承-个抽象类可以实现0~N个抽象方法
1.2.2 语法
1.2.3 注意
abstract 和 final 不能同时出现
abstract 修饰的类 是抽象类 , 就是用来被继承的 而 final 修饰的类 不能被继承
abstract 修饰的方法 是抽象方法, 而抽象方法 就是用来被覆写实现的,而final、修饰的成员方法 不能被覆写
1.3 接口
1.3.1 概述
引用数据类型:类数组接口
接口是- -种引用数据类型,可以看做是一个特殊的类是为了解决java中单继承功能变弱问题
个类只能继承一个父类但是可以实现N个接口
1 [修饰符] interface接口名{}
*
2 1.8之前接口中只有抽象方法和常量(public static final)
-2147483648~2147483647
3接口中public static fian!还有abstract都可以省略(接口中没有变量只有常量写个方法就是抽象方法)
4接口没有构造方法,不能创建对象
5一个类实现一个接口,需要实现所有的抽象方法
6一个抽象类实现- -个接口,需要实现0~ N个抽象方法
1.3.2 1.8 接口新特性
新特性:
1.8之前只能有抽象方法
1.8开始可以有静态方法和默认方法(可以理解为类中的成员方法)
1.9开始支持private方法
1.3.3 怎么用
多实现
类和接口直接是多实现保留类继承,所以当抽象类和接口都能满足需求的时候,优先使用接口
一个非抽象类实现接口后,需要实现所有抽象方法
一个抽象类实现接口后需要实现0~ N个抽象方法