类和对象的加载先后

Posted circle元

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类和对象的加载先后相关的知识,希望对你有一定的参考价值。

静态的代码块,属性和方法都会在类加载时就开始加载了,它们的加载顺序按程序先后;当实例化一个类时,会先加载普通属性>构造块>构造函数>普通方法

静态块:用static申明,JVM加载类时执行,仅执行一次
构造块:类中直接用{}定义,每一次创建对象时执行,而且优先于构造函数执行(构造代码块中定义的是不同对象共性的初始化内容,给所有对象进行统一初始化;而构造函数是给对应的对象初始化)
执行顺序优先级:静态块>main()>构造块>构造方法>普通方法
public class B
{
    public static B t1 = new B();
    public static B t2 = new B();
    {
        System.out.println("构造块");
    }
    static
    {
        System.out.println("静态块");
    }
    public static void main(String[] args)
    {
        B t = new B();
    }
}
静态块按照声明顺序执行,所以先执行public static B t1 = newB();该语句创建对象,则又会调用构造块,输出构造块
最后main方法执行,创建对象,输出构造块
正确的结果是:构造块 构造块 静态块 构造块
class Demo {  
    int x;  
    static int y = 3;  
    // 静态代码块  
    static {  
        System.out.println("静态代码块");  
    }  
    // 定义构造代码块  
    {  
        System.out.println("我是构造代码块");  
        System.out.println("x=" + x);  
    }  
    //构造函数  
    public Demo() {  
    }  
      
    static void print() {  
        System.out.println("y=" + y);  
    }  
  
    void show() {  
        System.out.println("x=" + x + "  y=" + y);  
    }  
}  
  
class StaticDemo {  
    public static void main(String[] args) {  
        //类名调用print方法  
        Demo.print();  
        //创建对象  
        Demo d = new Demo();  
        //给成员变量x赋值  
        d.x = 10;  
        //用对象调用show方法  
        d.show();  
    }  
}  

静态代码块
y=3
我是构造代码块
x=0
x=10  y=3

 

以上是关于类和对象的加载先后的主要内容,如果未能解决你的问题,请参考以下文章

类的加载顺序 类和对象的命名空间

片段内部静态类和gradle问题

java第五章:面向对象(oop)之 static关键字

C++类和对象下

js语言基础练习---------------函数的高级(了解),类和对象(重点)

java静态代码块,构造方法,构造代码块的执行先后顺序