static 关键字
java 类加载时机:
- new 创建对象时
- 读取/设置static 静态变量被(final修饰、已在编译期把结果放在常量池的静态字段除外)
- 调用static 静态方法
类加载器加载类把java类加载到jvm要做以下三件事: - 加载:查找和导入Class文件
- 链接:其中解析步骤是可以选择的 (a)检查:检查载入的class文件数据的正确性 (b)准备:给类的静态变量分配存储空间 (c)解析:将符号引用转成直接引用
- 初始化:对静态变量,静态代码块、普通变量、普通代码块构造方法执行初始化工作
下面详细说明第三点,初始化顺序:
父类静态变量
父类静态代码块
子类静态变量
子类静态代码块
父类普通变量
父类普通代码块
父类构造方法
子类普通变量
子类普通代码块
子类构造方法
父类
public class Parent {
private static String username="hahan";
private int oo;
static {
System.out.println("父类静态代码块");
}
{
System.out.println("父类普通代码块");
}
public Parent(String username){
System.out.println(this.username);
this.username = username;
System.out.println("父类构造方法");
System.out.println(oo+"======");
}
public static void std(){
System.out.println("父类静态方法");
}
public void show(){
System.out.println("父类普通方法");
}
}
子类
public class Son extends Parent {
private int age;
static {
System.out.println("子类静态代码块");
}
{
System.out.println("子类普通代码块");
}
public Son(String username,int age) {
super(username);
this.age = age;
System.out.println("子类构造方法");
}
public static void sta(){
System.out.println("子类代码块");
}
public void shoo(){
System.out.println("子类普通方法"+age);
}
}
测试类
public class Test {
public static void main(String[] args) {
// Parent parent = new Parent("lixiaolong1");
Son son = new Son("hello",39);
}
}
输出结果:
父类静态代码块
子类静态代码块
父类普通代码块
hahan
父类构造方法
0======
子类普通代码块
子类构造方法
public class Test {
public static void main(String[] args) {
//Parent parent = new Parent("lixiaolong1");
System.out.println(Parent.oo);
// Son son = new Son("hello",39);
}
}
输出结果:100
Question1? ***
static 可以修饰哪些?
static 可以修饰内部类、方法、成员变量;不能修饰普通类及非静态方法内的局部变量。
static 关键字修饰的变量、方法可以直接通过类名调用,为所有线程共享,只加载一次加载到方法区。普通方法内局部变量作用范围是方法内而static修饰后成为无论独立于对象的变量导致作用范围冲突*
来源:CSDN
作者:GeXueliu
链接:https://blog.csdn.net/GeXueliu/article/details/103651571