static关键字
修饰 类成员变量、成员方法、代码块、内部类、静态引包;
静态代表内存中只有一个备份,在类初始加载时进行初始化,并且只初始化一次;存放在JVM 方法区(又叫静态区,存放静态变量,class信息)。
一、类型
1、修饰成员变量:
static修饰的静态成员变量在内存中只有一个备份,类初次加载时初始化;非静态成员变量在创建对象时进行初始化,各个对象中拥有副本互不影响。
2、修饰成员方法:
static修饰成员方法,不需要创建对象情况下,可直接使用方法,静态方法不能使用非静态成员和非静态方法,但是非静态方可以使用静态方法和静态成员,因为非静态归属对象,静态归属类,不创建对象可以使用类方法,但是创建对象可以使用对象方法和类方法。
3、修饰代码块
修饰一个和多个代码块优化性能,比如,某些方法中的变量(出生年限)是固定的,因此放在static代码块在类加载时初始化一次是性能最好的。
4、内部类
static修饰内部类,普通类是不允许声明为静态的,只有内部类才可以,普通内部类创建必须先创建一个外部类,因为,内部类构造函数中系统为我们添加了指向外部类的引用,因此是持有外部类的应用,有关联,但同时可以访问外部类的成员。
静态内部类是解决单例和防止内存泄露中使用较多;
5、静态导包:
import static com.ancient.face.*
引入类的最后还加上了".*",代表类中的所有类方法直接导入。
采用static导入包后,在不与当前类的方法名冲突的情况下,无需使用“类名.方法名”的方法去调用类方法了,直接可以采用"方法名"去调用类方法,就好像是该类自己的方法一样。
二、初始化过程
1、类加载和构造过程
1、加载类
2、初始化静态变量和代码块中变量;
3、初始化普通变量;
4、类构造函数初始化;
如果使用上,没有创建对象直接调用类的静态方法,则静态方法会在2、3步骤中间,因为,没有初始化对象,静态成员变量是类加载后初始化的,然后可以使用类静态方法,如果在使用对象方法,则创建对象,则普通变量进行初始化,然后是构造函数;
2、子类继承父类的构造初始化过程:
宗旨:
1、先构造父类,再构造子类
2、如果类中有成员对象,则调用成员对象构造函数;
顺序:
1、父类静态变量(父类加载后初始化)
2、父类静态代码块
3、子类静态变量子类静态代码块(子类加载后初始化)
4、父类普通变量(父类对象实例构造函数前执行)
5、父类普通代码块
6、父类构造函数(父类构造函数)
7、子类普通变量(子类对象实例构造函数前执行)
8、子类普通代码块
9、子类构造函数(父类构造函数)
构造函数参数传递
1、子类有参或无参构造函数不调用父类构造函数,系统都会调用默认父类无参构造函数;
2、子类调用父类有参构造方法必须实现super,调用了父类有参数的构造方法,则不会再自动调用无参数的构造方法。