一、复用
1. 继承
1.1 初始化
默认情况,子类的构造器会在第一行调用父类的构造器 父类先被初始化,然后是子类 可以使用无参构造器,亦可有参构造器
public class Demo06 {
public static void main ( String [ ] args) {
Son son = new Son ( ) ;
}
}
class Son extends Father {
public Son ( ) {
System . out. println ( "son is created" ) ;
}
}
class Father {
public Father ( ) {
System . out. println ( "father is created" ) ;
}
}
1.2 清理工作
通过finally方法,来对创建的所有资源进行清理 生成顺序和清理(close) 顺序相反,避免在清理资源时候,资源之间的依赖问题导致的不必要的错误 先清理导出类,然后依次向上到根类
2 组合和继承
1.1 has-a
1.2 尽量使用组合
2.1 is-a
2.2 要用之前问一个问题:是否需要从导出类向基类向上转型
3. final
一个永不改变的编译时变量
1.1 必须用于基础数据类型
1.2 在编译时候就已经定下来,并且可以代入到对应的计算式中
1.3 编译时常量,减轻了运行时负担
一个在运行时候被初始化的值,而你不希望它能被改变
2.1 一般用于引用类型,数组
2.2 引用不可以变,但引用指向的对象其实是可以变的
3.1 可以声明一个不赋值的变量
3.2 必须在构造器中进行初始化
4.1 表示一个参数在方法中不能被改变
5.1 方法不会被覆盖
5.2 private的方法,其实也是final修饰的
6.1 不希望被继承的方法
6.2 关闭动态绑定
4. 加载顺序
1. 触发场景
一个类执行new动作时候 访问一个类中的static变量或者static方法时
2. 加载顺序
在类加载被触发的时候,查看当前类是否存在继承关系 基类-子类依次加载 先变量,后构造器
二、多态
接口和实现类,分离了做什么和怎么做 方法参数,尽可能用基类去接受参数
1. 向上转型问题
如果导出类相比基类,添加了新的方法,那么在向上转型的过程中,就会出现 “ 接口窄化 ”问题,但不会比接口更窄
2. 动态绑定
编译期间:实现的是前期绑定 后期绑定:运行时绑定,动态绑定。 在运行时候,根据对象的具体类型来进行判断 动态绑定只针对成员方法,对变量和静态方法无效
3. 构造器
构造器也是static修饰的,不过算是隐式的动态修饰
基类的构造器总是在导出类的构造过程中被调用:
1 . 构造器的特殊任务: 检查对象是否被正确的构造。
2 . 导出类只能访问它自己的成员,不能访问基类中的成员
3 . 只有基类的构造器才具有恰当的知识和权限来对自己的元素初始化
4 . 必须令所有的构造器得到调用,否则不可能正确的构造完整对象
三、接口
1. 基本使用
接口的所有的域都是static 和final修饰的,注意用大写 尽量不要在接口中去定义常量,而是用enum或者class 方法默认都是public修饰的(不然会缩小作用域)
2. 原因
解决java的单继承问题,从而可以向上转型为不同的基类 使类不能进行实例化