菜鸟学JAVA之——static静态代码块

静态代码块

static可以修饰属性、方法、内部类、代码块

静态代码块在类加载时就调用, 而且只执行一次, 并且优先于各种代码块以及构造函数。

有一个地方的静态代码被使用,那么所有的静态代码块都会被调用

下面通过实例理解一下

父类

public class Human {
    static {
        System.out.println("2.父类中的静态代码块");
    }
    public String name;
    public Human() {
        System.out.println("1.父类中的构造方法");
    }

    public static void test() {
        System.out.println("6.父类中的静态方法");
    }
}

子类

public class Man extends Human {
    static {
        System.out.println("4.子类中的静态代码块");
    }
    public Man() {
        System.out.println("3.子类中的构造方法");
    }
    public static void doo() {
        System.out.println("5.子类中的静态方法");
    }
}

主类

public class Main {
    public static void main(String[] args) {
        // Human human = new Man(); 输出2 4 1 3
        
        //父类的类名调用父类的方法
		//Human.test();      输出2 6   在调用静态代码时,怕需要上面的静态代码块的内容,所以将其链接到内存    与子类无关
        
        //子类的类名调用子类的方法
        //Man.doo();       输出2  4  5  在调用子类的静态方法时,父类的静态代码块执行,与父类的静态代码块有关
         
         //子类的类名调用父类的方法
         //Man.test();   输出  2 6  注意这个能调test不是因为继承,test声明在了human里,子类可以调用父类的方法,但是父类不能调用子类的方法  所以在Main中不可直达Man中的的方法

        //子类调用了父类的方法,在父类的方法里又引用了子类里的静态方法
        //Man.test();    输出  2 6 4 5
    }
}

静态代码块内容先执行(但只执行一次),接着执行父类构造方法,然后执行子类构造方法。

什么时候加载类?
主动引用
1、使用new关键字实例化对象
2、调用一个类的静态方法的时候
3、访问某个类或者接口的静态变量,或者对该静态变量赋值
4、当初始化一个类时,发现其父类还没有进行初始化,则需要先触发其父类的类的初始化
5、JVM启动时标明的启动类,即文件名和类名相同的类
所有引用类的方式都不会触发初始化,称为被动引用,如下:
1、通过子类引用父类的静态字段,不会导致子类的初始化
2、通过数组来定义引用类,不会触发此类的初始化
3、常量在编译阶段会存入调用类的常量池,本质上并没有直接引用到定义常量的类

对于3举个例子:

public class Woman {
    public static final int a = 1;
    static {
        System.out.println("我是女人类的静态代码块");
    }
}

public class Main {
    public static void main(String[] args) {
     System.out.println(Woman.a); //只是输出1,但如果a不定义为常量,这里调用a就会加载Women类的静态代码块
    }
}

双亲委派原则

类加载一般符合双亲委派原则
如果一个类收到了类加载的请求,不会自己先尝试加载,先找父类加载器去完成。当顶层启动类加载器表示无法加载这个类的时候,子类才会尝试自己去加载。当回到最开的发起者加载器还无法加载时,并不会向下找,而是抛出ClassNotFound异常。(如果类A中引用了类B,Java虚拟机将使用加载类A的类加载器来加载类B)
在这里插入图片描述
双亲委派原则是参考这两个网址的内容:
https://blog.csdn.net/u014307117/article/details/47307225
https://blog.csdn.net/weixin_43784989/article/details/99312079

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章