面向对象系列四
一、抽象方法
没有方法体即没有任何实现的方法是抽象方法,只有在抽象类中才有更多的允许,允许上这种方法的存在,所以抽象方法只能存在于抽象类中,但一个抽象类不是一定就有抽象方法的,它只是允许
- 抽象方法在将来被使用时一定是被重写的,所以它一定是非静态的、不能被final、private修饰的
二、抽象类
抽象类是允许抽象方法存在的类,所以是不能直接对着抽象类类变量创似复刻变量,但可通过作为父类继承于子类,对着子类类变量创建似复刻变量来间接创上有父类抽象类类变量的似复刻变量,抽象类与普通类相比,只是多了层里面抽象方法的存在允可,但也因此失去了对着其直接创似复刻变量直接实例化的能力,其它的与普通类都一样(它也有构造方法但构造方法的调用都是在间接实例化创似复刻变量时调用的,直接实例化创似复刻变量无)
三、意义检查
1.抽象方法的意义
抽象方法就是为了解决被重写方法方法体内容无效就不需要存在而去省略,达到的代码简洁与同时加上了编译器本达不到的为重写目的的编译检查
2.意义检查
编译器对无方法体的方法有严格的意义检查,因为它本身的实现是无意义的,唯一有意义的地方就在于重写,如果在将来无方法体的抽象方法在去使用时一旦没达到重写的效果,编译器的检查就会对它报错,因为它的存在无意义且被捕捉到了(编译器一直对抽象方法有监视)
体现
- 在上面的实例化时无法直接创建含有抽象方法的类变量的似复刻变量也是意义检查下的体现,不能对它直接实例化的原因是因为直接实例化无意义,而被继承创子类时,间接实例化创有子类类变量的似复刻变量可对它向上转型实现方法重写的间接实例化有意义而被允许
- 创建抽象方法、创建抽象类来允许存放下抽象方法编译器允许它们存在的意义也就是为了能实现抽象方法的代码简洁与重写检查这些好处的意义,当抽象方法所在的抽象类被继承时,抽象方法就开始在可被使用范围了,如果此时抽象方法没有在父类被继承下被重写,编译器会对其无意义的报错提示
所以编译器都是在有规定意义的检查下进行的(编译器意义检查的这些意义都是有先已规定确定下来的供检查用的)
四、接口
1.级别层次
接口与类是同级别同层次的:
- 接口类型与类类型同级别同层次,接口类型interface创建接口变量、类类型class创建类变量
- 接口变量与类变量也是同级别同层次的
2.接口变量
接口变量是抽象类类变量的抽象升级版 :
相同点:
- 接口变量与抽象类类变量一样都有加层抽象成员的存在允可但不一定就一定有抽象成员的,与抽象类一样,在这层抽象成员存在允可下它不能被直接实例化直接创似复刻变量,接口变量实例化创它的似复刻变量也是只能通过间接来实例化
不同点:
- 与抽象类类变量不同的是,接口类变量内部不能有代码块、构造方法,因为它的成员变量有的话只有静态常量,而静态常量是不能被修改的
(代码块、构造方法是主要目的是用来对成员变量进行赋值的,如果一个类已明确它的成员变量是不能被修改再赋值的,里面再来构造方法、代码块就是无意义的)
3.意义
接口变量存在时的有意义是准备当作接口的有意义,被使用时的有意义是里面所有的抽象方法都有接口当作父类被继承被都被重写的有意义
4.成员
成员变量:
成员变量有都被static final隐式补全修饰,接口里的变量都是静态变量变成的静态常量,都必须都要初始化
成员方法:
- 无方法体的抽象方法都有被abstract隐式补全修饰(抽象方法都是非静态的)
- 可自己加static写非抽象有实现的静态方法
- 可自己加default写非抽象有实现的非静态方法
隐式补全修饰:
接口变量里所有成员的访问权限是public且都有被public隐式补全修饰
(变量主体的所有部分、方法主体的所有部分都不会有自动补全都必须写完整,只有那些访问修饰符、状态修饰符、final、abstract这些修饰符有出现默认修饰自动补全不用写默认有修饰的情况)