Java学习笔记1:杂谈(多态,抽象类,接口)

一、关于多态
方法调用绑定:将方法调用与方法主体关联
程序运行前绑定:前期绑定(如果有的话由链接器和编译器决定)(c语言)
后期绑定(动态绑定):运行时判断对象类型,调用正确方法(虽然编译器不清楚对象类型,但是方法调用机制能找到正确的方法体)
plus:final可以关闭动态绑定,但是大部分情况下不会提升性能
注意1:private方法对于派生类来说是隐藏的!尝试重写编译器不会报错,但是并没有重写的效果,若加上@override编译器会报错
注意2:属性没有多态,只有普通的方法调用可以是多态的。若直接访问属性,该访问会在编译时解析
同样,如果一个方法是静态的,他也不具有多态性。静态方法只与类关联,与单个对象无关。
如果在构造器内部调用了正在构造的对象的动态绑定方法会发生什么?
初始化的实际过程:
1.在所有事发生前,分配给对象的存储空间被初始化为二进制0
2.调用基类构造器,若构造器里有方法被派生类重写,调用重写后的方法(此时派生类构造器害没有被调用)。
3.按声明顺序初始化变量。
4.调用派生类的构造器
给我们的启示:构造器应该尽可能的少调用方法,或者只调用final或private方法
二、协变返回类型
派生类的重写方法可以返回基类方法返回类型的派生类
java5之前要求必须返回基类
向下转型:可以使用,若有问题会抛出ClassCastException
三、关于接口
1.抽象类:不能实例化的类
若某类含有abstract方法,他必须定义为抽象类,否则会报错
抽象类里也可以不含任何抽象方法
抽象类的继承类必须重写所有抽象方法
不允许private abstract class
抽象方法可以是public protected 或 friendly
当然抽象类也可以含属性,若是静态属性也可以用xxx.xxx访问
2.interface 关键字
可以理解为abstract class
java8 之前interface只允许有抽象方法,且不用关键字abstract,且所有方法都默认且必须是public
问:abstract class呢?

答:
来源:牛客网
关于抽象类
JDK 1.8以前,抽象类的方法默认访问权限为protected
JDK 1.8时,抽象类的方法默认访问权限变为default
关于接口
JDK 1.8以前,接口中的方法必须是public的
JDK 1.8时,接口中的方法可以是public的,也可以是default的(默认是public)
JDK 1.9时,接口中的方法可以是private的

问:default访问权限是什么?
就是包访问权限!
问:抽象类里的属性方法可以定义为public吗?
当然可以,但是注意复写时也得加public
问:default只能interface用吗?
是的

java8 允许接口包含默认方法与静态方法(static)
接口名若与文件名相同要加public(废话)
不加public接口只有包访问权限 just like class
接口也可以包含属性,这些属性被隐式指明为static final
问:抽象类呢?
答:可以有普通属性,也可以有常量
使用implements 关键字使一个类遵循某接口
可以用default关键字为方法提供实现,即允许在接口中实现方法
问:default方法可以被复写吗?
可以
涉及到多继承,之后再作答。。
3.多继承
java8之前只能继承一个类(或abstract类)
但可以继承任意个接口
问:编译器通过什么区分方法?
答:方法签名:方法名和参数类型
继承两个接口时,必须保证他们的方法签名不同
不然必须复写同名方法
还有一种情况,一个类继承的父类和实现的接口中都有同一个方法,而这个类又没有重写时,实现的是父类的方法,而不是接口中的方法。
接口中的静态方法
接口与抽象类的区别
4.完全解藕
****实操注意:
1.接口里的方法不是default且有具体实现的话必须定义为static
2.接口里的方法若没有具体实现,必须在派生类里重写
3.static方法是不能被重写的,若在派生类里写了同名方法,调用时用的是派生类里的方法
4.接口虽然不能实例化,但是调用他的静态方法时还是可以xxx.方法
5.静态属性也是同理,不过静态属性是static final的
6.抽象的静态方法是可以被继承的,不可被复写,但是接口的静态方法不可以被继承
7.default方法可以被重写,default方法必须有实体
8.继承类不能定义一个与基类里static方法同名的非static方法,但是可以定义一个与其同名且同返回值的static 方法
调用时调用的就是继承类里的static方法了
9.接口只能extends接口不能implements接口
四、多接口结合
1.允许继承一个类与多个接口,并且可以为每个接口向上转型
2.想创建一个对象必须所有的定义都存在
3.不同接口中最好用不同的方法名
五、接口的适配
1.举个例子 Scanner的构造器接受的是一个Readable接口,我们创建了类之后Implements Readble就可以让Scanner适用于他
2.要是我们的类没有reable接口怎么办?
创建一个类既有reable接口又有我们的类的接口
六、接口字段
接口字段都是默认static final的,且自动是public的,所以我们可以在接口里定义一些常量
接口字段必须被初始化
七、接口嵌套
接口可以嵌套在类或其他接口里,有一些有趣的特性
比如可以搞几个private 接口
接口之间也能嵌套,不过接口的元素必须是public的,这是一定的!
八、接口与工厂方法模式
就是套娃,也没啥
就是我们如果需要用某个service方法,可以创建一个servicefactory接口来实现(说不太清,无所谓)
接口提供了间接层,可以来创建框架
总结:接口是个很伟大的工具!

posted @ 2021-05-12 19:05  tzy_QaQ  阅读(52)  评论(0)    收藏  举报