封装、继承、多态
1、封装:
将 细节 隐藏=某属性、方法 用private修饰,其他类 无法调用
提供 公共 访问方法or接口。
---------应用
失血模型=1个类 仅私有属性,每个属性 提供 公共的get、set方法。不存在其他带逻辑判断的方法
2、继承: extends 类与类的关系
a、子类拥有父类 非private的属性和方法=可直接调用
b、子类可有自己的 属性和方法=子类可对父类扩展
继承关系中执行顺序:
父类静态 >> 子类静态 >> 父类构造代码块 >> 父类构造函数 >> 子类构造代码块 >> 子类构造函数
静态 优先于 对象存在,率先执行
构造代码块 一定在 构造函数 之前执行
先父类后子类
3、多态:
a、综述:
程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用
在编程时并不确定,而是在程序运行期间才确定。
即一个引用变量倒底会指向哪个类的实例对象?该引用变量发出的方法调用到底是哪个类中实现的方法?
必须在由程序运行期间才能决定。
因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
b、所以对于多态我们可以总结如下:
父类/接口 对象名=new 子类();
父类/接口 声明的引用 指向 子类实例;
指向子类的父类引用由于向上转型了,它只能访问父类中拥有的方法和属性,
而对于子类中存在而父类中不存在的方法,该引用是不能使用的,尽管是重载该方法。
( 如果上述转型,那么这个对象不能使用子类特有的方法和属性 想要使用需要再次向下转型成子类声明:
向下转型:子类 对象名2=(子类)对象名1
)
c、对于面向对象而言,多态分为编译时多态和运行时多态。
其中编辑时多态是静态的,主要是指方法的重载(方法名相同),它是根据 参数列表的不同 来区分不同的函数,通过编辑之后会变成两个不同功能的函数,在运行时谈不上多态。
而运行时多态是动态的,它是通过动态绑定来实现的,也就是我们所说的多态性。
d、动态绑定:
静态成员属性、方法
普通成员属性、方法
普通成员方法:编译看父类,运行看子类
其他均为 编译运行看父类
补充:
this关键字:
代表 本类对象,本质是1个对象,因此不能在static方法、代码块 中用。
作用1:当 局部变量 和 成员变量 冲突,this.为 成员变量。用以区分
作用2:哪个对象调用此方法,this就是那个对象
super关键字:
本质上是1个对象=父类对象
每1个构造方法 的第1行都是super();
作用:调用父类的构造方法 如果没有写,虚拟机直接调用默认的 无参构造
接口 和 抽象类 区别:
属性:
接口 静态常量=public static final String name=""
抽象类 可以有普通属性
方法:
接口 默认public abstract修饰,没方法体 、 不能有静态方法
抽象类 可以有普通方法、静态方法、有无抽象方法都可
构造函数:
接口 没有构造方法
抽象类 可以有,但不可new 用于子类的初始化
初始化块:
接口 不能有
抽象类 可以有
多实现 弥补了单继承的不足
单继承=仅有1个直接父类
所以————工作中 如果仅要规范子类行为,用接口