static final 静态/构造/局部 代码块
1.static final
- 是java关键字
- static 用于修饰成员变量/成员方法
final 用于修饰类/成员变量/成员方法 - 均不能和abstract关键字一起使用
1.1 static
- 随类加载和结束(先于对象,不开辟新内存)
- 全局共享(全局唯一 被同一类的不同对象共享)
- 通过类名调用
- 静态只能调用静态(不能直接调用非静态)
- 不能和this和super共用
静态关键字不能用于方法内部
1.2 final
- 被final修饰的类,不能被继承
- 被final修饰的方法,不能被重写
- 被final修饰的变量是个常量,值不能被改变
2.静态/构造/局部 代码块
- 静态代码块:在类加载时就加载,并且只被加载一次,一般用于项目的初始化
- 构造代码块:在创建对象时会自动调用,每次创建对象都会被调用,提取构造共性
- 局部代码块:方法里的代码块,限制局部变量的范围
2.1 调用顺序
// 1.静态代码块
// 位置:类里方法外,格式:static{ }
// 执行时机:随着类的加载而加载,优先与对象加载,并且只加载一次
// 作用:用于加载一些需要第一时间就加载并且只加载一次的资源
// 2.构造代码块
// 位置:类里方法外,格式:{ }
// 执行时机:创建对象时触发,优先于构造方法执行
// 作用:用于提取所有构造方法的共性功能
// 3.局部代码块
// 位置:方法里,格式:{ }
// 执行时机:调用当前所处方法时才触发
// 作用:用来控制变量的作用范围,变量的作用范围越小越好
// 4.执行顺序:
// 静态代码块->构造代码块->构造方法【创建好对象】->调用局部代码块所处的普通方法
2.2构造代码块和成员变量
成员变量集合\数组 在构造代码块中添加值之前 必须先被声明
public class testFinal {
private Integer a=1;
//private Collection<String> b=new ArrayList<>();
{
a=1;
b=new ArrayList<>();
// b.add("1");
}
private Collection<String> b=new ArrayList<>();
}
3.多态
面向对象的一大特征
3.1概念
指同一个实体同时具有多种形式
- 即多个父类对象可以通过多态使用多个不同子类的方法
即用子类引用初始化父类对象,父类对象就可以调用该子类的某些方法
Father fa1 = new Son1(); Father fa2 = new Son2();
- 多态对象只能调用父类中定义子类中重写的功能,并不能调用子类的特有功能
3.2 特点
- 两个前提:继承/重写
- 父类引用指向子类对象,如:Animal a = new Cat();
- 多态中,编译看左边,运行看右边
3.3 好处
- 代码复用
把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。赋值之后,父类型的引用就可以根据当前赋值给它的子对象的特性调用重写的方法 - 不用关心使用对象的具体类型
3.4 使用
前提:多态对象把自己看做是父类类型
- 成员变量: 使用的是父类的
- 成员方法: 由于存在重写现象,所以使用的是子类的
- 静态成员: 随着类的加载而加载,谁调用就返回谁的(即父类不能调用子类的)
4.其他
4.1重写和重载
重写是子类 重载是同类
重写是运行时多态 重载是编译时多态
编译时检查参数类型,不检查方法体
4.2 静态变量 实例变量
实例变量只有对象初始化了才分配空间
静态变量在类加载时分配
4.3 向上 向下转型
向上 子类赋值给父类
向下 父类赋值给子类,前提是该父类是由子类向上转型得来