1、代码块
属于类的成员之一 ==> 定义在类的成员位置
分类:
1)、静态代码块
作用:一些需要被较早执行的代码可能考虑将其定义到静态代码块中,则随着类的加载静态代码块也会被加载执行,其内部代码执行时机较早了
特点:随着类的加载而被触发执行,只会被执行一次,因为类加载也只会是一次
格式:
?? ?static {
?? ? ?...
?? ?}
2)、构造代码块
作用:类中多个构造方法内部都需要定义相同的代码,不需要每个构造方法内部都写一遍;将其抽取到构造代码块中,则每次创建对象构造代码块都会被触发执行一次
特点:每次创建对象,则构造代码块都会被触发执行一次
格式:
?? ?{
?? ? ?...
?? ?}
构造方法内部首行位置都需要考虑隐式三步:
①.super(...)
②.非静态属性进行显示赋值操作
③.执行构造代码块
【注意】:②、③,没有先天的先后顺序,谁先谁后执行完全取决于代码定义的先后位置
3)、局部代码块
作用:限制代码的使用范围 ==> 只能在局部代码块内部被使用
格式:
?? ?{
?? ? ?...
?? ?}
【问题】:如何区分构造代码块和局部代码块
构造代码块:定义在类的成员位置
局部代码块:定义在类的局部位置
2、面向对象特性之继承性
生活层面:皇位、爵位、子承父业
程序层面:
多个类中都需要定义相同的成员(属性、方法)代码,如果在这多个类中都去显示的定义一遍,
显然程序代码的复用性就很差,所以我们考虑将共同的代码抽取到一个共性的第三方类中,
让这多个类都去继承这个第三方共性类,则这个第三方类中的成员这多个类都可以使用到了
关键字:extends、super
搭建场景:
class A {}
class B extends A {}
A类:属于B类的父类型,又被称为:基类、超类、superclass
B类:属于A类的子类型,又被称为:派生类、subclass
搭建继承关系图:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?食物
? ? ? ? ? ?水果? ? ? ? ? ? ? ? ? ? ? ?水产品? ? ? ? ? ? ? ? ? ? ? ? 豆类
苹果?? ?香蕉?? ?西瓜?? ??? ?鱼?? ?虾?? ?蟹?? ??? ?红豆?? ?黄豆?? ?黑豆
越往上层/顶部的类:越抽象、越共性、越模糊
越往下层/底部的类:越清晰、越具体、越独立
学习技巧:
学习完毕目前面向对象章节后,会进入到之后高级类特性阶段的学习,主要学习jdk核心类库中常用的一些第三方体系,比如:字符串、集合、IO、异常、多线程...。在学习这些体系的过程中,我们应该先学习偏顶部的类/接口 ==> 内部封装定义了所有底部类共同的成员,再学习偏底部的常用类 ==> 这些类开发主要使用,它们既可以使用父类中的共同成员的同时,又可以使用自己独有的成员,在实例化对象的环节,我们更加青睐于去创建偏底部类的对象。
注意事项:
1)、对于Java语言,类和类之间只能满足单一继承 ==> 一个类只能有一个直接父类
2)、对于Java语言,类和类之间可以存在多重继承 ==> 一个类可以有多个间接父类
3)、对于Java语言,如果有需要类可以有多个子类
4)、由于Java语言类和类之间只能是单一继承,存在一定的局限性;所以Java设计者提出了接口这种技术,类可以同时实现多个接口,多个接口内部的成员该类都可以使用到;
5)、语法层面:类和类之间只要使用extends关键字就可以发生继承关系 ==> final修饰的类除外使用层面:类和类之间必须存在一层"是"的关系,需要满足生活的逻辑和常态,不能为了继承而继承
6)、实例化某类的对象,内存中会一路调用super(...)构造方法,直到Object()构造方法为止;中间有任何环节出现问题,导致到不了Object()构造,实例化操作一定以失败而告终。
7)、父类私有化的成员子类通过继承也可以得到,只是由于封装性的原因不能直接使用罢了。
super关键字:
三个作用:
作用一:调用父类构造方法
格式:
? ? ?super(...);
记住:
?? ?1)、谁的属性交由谁来完成赋值操作
?? ?2)、子类构造方法内部调用父类构造,必须定义在首行位置
作用二:调用父类的非静态属性
格式:super.非静态属性名
子父类中都定义了相同名字的非静态属性,在子类方法内部调用该非静态属性,默认调用的是子类中的该非静态属性,如果想要访问调用父类中的该非静态属性,则需要显示定义super.非静态属性的方式来实现。
作用三:调用父类的非静态方法
格式:super.非静态方法名(...);
子父类中都定义了相同名字的非静态方法,在子类别的方法内部调用该非静态方法,
默认情况下调用的是子类中的该非静态方法,如果想要访问调用父类中的该非静态方法,
则需要显示的定义super.非静态方法(...)来实现。
3、方法的重写
又被称为:复写、覆盖
英文描述:override、overwrite
前提条件:存在继承关系(子、父)
作用:
?? ?父类中的方法子类需要使用它,但是方法体的逻辑不能完全满足或完全不满足子类需求,则此时考虑在子类内部重写父类的该方法 ==> 写到满足子类要求即可
需要如下5点要求:
1)、子类重写父类中的方法,方法名必须和父类方法相同;
2)、子类重写父类中的方法,方法的形参列表必须和父类方法相同(类型、个数、顺序相同);
3)、子类重写父类中的方法,方法的访问修饰符必须和父类方法相同(例如:static);
4)、子类重写父类中的方法,方法的返回值类型必须和父类方法相同;
5)、子类重写父类中的方法,方法的权限修饰符必须大于等于父类方法的权限。
总结:
? ? 1)、方法的重写操作必须满足4同1不低原则;
? ? 2)、在实际编码环境下,对于重写操作我们只需要复制父类需要被重写方法完整的方法签名就一定可以保证4同1不低。
4、抽象
理解:模糊的、不清晰的、描述不清的...
关键字:abstract
修饰的领域:
1)、修饰方法
称为:抽象方法
在设计方法的过程中,发现方法体的逻辑怎么定义都不太合适,此时可以考虑将该方法设计称为抽象方法 ==> 描述不清的行为
具体步骤如下:
?? ?步骤一:去除大括号以分号进行结尾;
?? ?步骤二:在返回值类型的前面追加定义abstract关键字。
2)、修饰类
称为:抽象类
一旦类的内部定义了抽象方法,则该类也必须被定义为抽象类,在class前加abstract
注意事项:
1)、抽象类不可以实例化/创建对象;
2)、抽象类也是类,内部有构造方法(只要是类就有构造方法);
3)、抽象类存在的意义就是为了给子类继承的;
4)、抽象类内部可以不定义抽象方法,语法没问题,实际使用很少这么干;
5)、抽象类内部可以定义具体类所有的成员,并且还可以定义抽象方法;
6)、子类继承抽象父类,需要重写父类(直接、间接)中所有的抽象方法,则子类就是一个具体类,可以实例化对象;反之,子类也必须被定义为抽象类。
本电子书目录:《Java基础的重点知识点全集》?