20180916第四周周记

多态
1.概念:在OOP中,多态是指一个对象有多种形式的能力。一个类的子类可以定义它们唯一的行为,同时共享父类的某些相同特征。(相同的行为,不同的实现)
2.分类
(1)静态多态
①概念:静态多态指的是程序在编译时,系统就能决定调用哪个方法,所以也称为编译时多态
②实现方式:方法重载
③调用规则:依据对象在定义时的类型相应地调用对应类中的重载方法
(2)动态多态
① 概念:动态多态指在运行中系统才能动态确定方法所指的对象,所以也称为运行 时多态。
② 实现方式:重写父类中的同名成员方法
③ 调用规则:依据对象在实例化时而非定义时的类型,相应地调用对应类中的同名成员方法。也就是说,动态多态主要通过动态绑定和重写的机制来实现。 
④ 多态的技术基础
1)向上转型
a.概念:一个父类的引用变量可以指向不同的子类对象,或者说一个子对象可以被当作一个父类类型。
b.特点:
a)引用数据类型只能发生在父子之间,不能指鹿为马
b)应引用数据类型的向上转型,是指向父类转型编译器会自动识别
c)能转型成的原因是:父类的范围>子类的范围
d)父类的引用为什么可以指向子类的实现:子类实例中一定有一个完整的父类值数据
2)向下转型
a.引用数据类型向下转型是有风险的,不一定成功。
b.成功的条件
a)必须是父类的引用指向一个子类的实现
b)子类的引用最终必须指相同类型向子类的实现
3)instanceof关键字
a.概念:instanceof关键字用于判断运行时对象的真正类型。
b.引入原因:Java语言的多态机制导致了引用变量的声明类型和实际引用对象的类型可能不一致。为更准确鉴别一个对象的真正类型,Java语言引入了instanceof运算符。
c.主要作用:规避在强制向下转型中可能会出现的风险

4)动态绑定技术
运行时根据父类引用变量所指对象的实际类型执行相应的子类方法,从而实现多态性。

⑤ 多态的主要运用
1)多态参数:当方法的某个形式参数是一个引用的时候,与该引用兼容的任何对象都可以传递给方法,从而允许方法接受不同数据类型的形式参数。
2)多态最常见的应用是创建一个不是同一类型,但是有共同父类的数据集合。不同对象的集合称为异构集合。
3.多态总结
(1)使用父类类型的引用指向子类的对象。
(2)该引用只能调用父类中定义的方法,不能调用子类中独有的方法。
(3)如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法
(4)在多态中,子类可以调用父类中的所有方法。

抽象
1.抽象类
(1)概念
①当一个类的所有行为,都无法具体实现的时候,或者说这个类失去了被实例化的含义的时候,就可以将一个类抽象为抽象类
②不能被实例化的类
(2)特点
①在抽象类中,类的所有其它功能都存在,成员变量、方法、构造器都可以用同样的方式访问。我们只是不能创建抽象类的实例。
②抽象类中,不一定要有抽象方法,但是抽象类身上,不一定拥有抽象方法
③如果一个类中存在抽象方法,那么那个类就属于抽象类
④使用关键字abstract可以声明一个抽象类
⑤抽象类除了不能实例化以为,其他的都跟普通的类没有差别
(3)成员组成
①成员变量
②方法行为
③静态属性和行为
④初始化块
⑤构造器
1)但是构造器此时的作用并非是为了创建对象,而是为了用于分配成员变量的储存空间
⑥抽象方法
2.抽象方法
(1)将一个方法声明为抽象方法有两个结果:
①子主题 1类也必须声明为抽象类。如果一个类包含了抽象方法,那么该类也必须是抽象的。
②任何子类必须重写抽象方法,除非子类本身也是抽象的
(3)特点:抽象方法只有方法签名,没有方法体。
(4)作用:abstract还可以规范子类的行为,强制要求子类必须重写父类的方法实现

1.接口的概念
接口是一种由外部给类选择性添加行为的一种新的数据类型

2.接口的特点
(1)接口文件最后也会被变异成字节码文件(服务器.class)
(2)接口跟抽象列一样不能被实例化,只能由接口的实现类来实例化
(3)接口中的所有方法,都只能定义成抽象方法,不能拥有方法体
(4)接口中所有方法,访问修饰符都是public,就算不写默认也是public
(5)接口中不能有构造器,也不能拥有初始化块(静态初始化块)
(6)接口中不能定义成员变量,只能定义公开的并且是静态的常量,在定义常量时,可以写成public static final,也可以写成static final,也可以写成final。甚至可以不写。但是不代表属于同包。
(7)接口中可以定义无限个常量,可以定义无限的抽象方法(理论上)
(8)接口在使用上来讲,不能被实例化,所有抽象方法都必须由接口的实现类来实现
(9)类不能继承接口,只能实现接口(implement),类只能单继承,但是可以多实现,用逗号隔开
(10)JDK1.8后,在接口中可以使用default关键字,声明非抽象方法。但是真正的访问修饰符还是public,,,default此时只是声明关键字,而不是访问修饰符
(11)接口中可以使用static声明方法,但是必须有方法体的实现“{}”
3.接口的使用原则
(1)使用接口解决多继承
(2)一个类智能继承一个父类,但可以实现多个接口,用逗号隔开
(3)使用interface 声明接口,接口使用extens继承接口,用implements实现接口,类一旦实现了接口,那么就必须遵循“契约”,去实现接口的所有抽象方法
(4)使用接口为外部类添加功能
(5)以面向对象的角度考虑将一个类与身自来的特征和行为和依赖于外部的可选的特征和行为分离,让类尽可能的丰富,让我们在设计程序的时候,不再关注具体的类,而是分离关注类上拥有哪些接口所.定义的能力,从而做到程序设计时,类类的直接关系,变换为类-接口-类,这种变换关系,也被称之为”解耦”
4.接口的优点
(1)将设计和实现分离,对外(调用者)隐藏了实现(而通常调用者也不关心实现)
(2)用接口暴露类的行为
(3)规范类的行为
(4)面向对象编程是OOP的核心
5.接口和抽象类的区别
(1)接口里所有方法都说abstract的,所有属性都是public static final
(2)抽象类是接口的部分实现,既能定义abstract方法,也能定义普通的方法和属性,比接口更加灵活
(3)正确选择两者使用的时机
(4)还可以从定义和设计的层次进行区分
6.接口与多态
(1)接口和实现类的关系,依旧是is..a的关系,同样可以使用”转型技术”
(2)接口引用类型转换的时候,如不过不是该的实现类,将无法转型成功,因为不是父子关系

1.概念
异常(Exception)是程序在执行过程中所产生的问题
2.异常的类型
(1)检查异常(编译时异常),由编译器检查出来的异常
(2)只有在程序运行时才抛出的异常
(3)错误,实际上已经脱离了异常的范畴,因为程序员无法通过修改代码解决问题,比如:内存不足,网络连接问题
3.异常的流程控制
(1)方法本身直接抓捕异常,并继续让这个异常对象沿着方法调用栈继续向下传递
(2)方法的本身直接抓捕异常,不让这个异常沿着方法调用栈继续传递下去
(3)不去抓捕异常,就让这个异常对象沿着方法调用栈继续向下传递,并让方法从方法栈中直接弹出
4.处理异常
(1)throws关键字,用来给方法的调用者提前声明,这个方法可能会抛异常
(2)方法异常的声明,通常用于编译时异常,而运行时异常不需要
(3)当一个方法中,可能抛出不计数的异常个数,解决方案有两种
①定义多个catch块,分别进行代码监控,另外一个需要注意的是:在定义多个catch块的时候,定义的顺序需要遵循从小到大的顺序
②在catch块的参数类型定义时,直接定义上层父类,采用动态多态的方式来解决问题
(4)编译时异常解决方案: 要么直接异常处理,要么就给方法的调用者进行异常声明运行时异常的解决方案: 不需要异常处理,也不需要异常声明,让他报错,报错以后,程序员通过条件判断语句解决
5.异常的抓捕、声明、抛出
(1)抓捕
①try-catch
②try-catch-catch…
③try-catch-finally(finally通常伴随捕获模块出现,用于配合catch出现

④try-catch-catch…-finally
(2)声明
①声明异常的原因:(事务)参与到同一个业务范围内的业务方法,为了保证事务的完整,必须声明异常,而不是抓捕异常,否则外部无法进行事务控制。调用者必须知道被调用者返回的具体结果
②声明异常的时机
1)当一个方法的调用者,需要知道调用方法的具体执行前情况,而并非是成没成功,失没失败,就有必要进行异常声明
2)例如:transfer()想要知道张三给李四转钱5000这个过程中。所有执行方法的具体执行情况
3)在方法声明的时候,如果遇到子异常和父异常都有可能出现的情况,建议声明父异常,因为子异常可以自动向上转型

(3)抛出
①用new,抛给下一个方法
②变量的声明放在try外面,变量的实例放在try里面。
6.异常的继承体系
(1)Throwable
①Exception
1)编译时异常
2)运行时异常
②Error

猜你喜欢

转载自blog.csdn.net/Lsy_Coder/article/details/82729706