JAVA静态代码块的作用及执行顺序

一般情况下,如果有些代码必须在项目启动的时候就执行,需要使用静态代码块。这种代码是主动执行的,需要在项目启动的时候就初始化。

有些代码是在不创建对象的情况下,由其他程序来调用,需要使用静态方法。这种代码是被动执行的。 静态方法在类加载的时候就已经加载,可以用类名直接调用

比如main方法就必须是静态的 这是程序入口

两者的区别就是:静态代码块是自动执行的,而静态方法是被调用的时候才执行的。


区别很简单:静态代码块,在虚拟机加载类的时候就会加载执行,而且只执行一次;非静态代码块,在创建对象的时候(即new一个对象的时候)执行,每次创建对象都会执行一次


相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,    一般在代码块中对一些static变量进行赋值。不同点:静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法)。    静态代码块只在第一次类加载时执行一次,之后不再执行,而非静态代码块在每new    一次就执行一次。非静态代码块可在普通方法中定义(不过作用不大);而静态代码块不行。例://普通类public class PuTong {public PuTong(){System.out.print("默认构造方法!-->");}

//非静态代码块{System.out.print("非静态代码块!-->");}

//静态代码块static{System.out.print("静态代码块!-->");}

public static void test(){{System.out.println("普通方法中的代码块!");}}}

//测试类public class TestClass {

/*** 区别两次new静态与非静态代码块执行情况*/public static void main(String[] args) {PuTong c1 = new PuTong();c1.test();

PuTong c2 = new PuTong();c2.test();}}

/*运行输出结果是:静态代码块!-->非静态代码块!-->默认构造方法!-->普通方法中的代码块!非静态代码块!-->默认构造方法!-->普通方法中的代码块!*/

继承的时候:

分析:对象的初始化顺序:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,
如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。
子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。 
而且子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,
否则编译不能通过。

原文地址:https://www.cnblogs.com/wjlwo2ni/p/10996985.html

时间: 2024-10-08 11:43:32

JAVA静态代码块的作用及执行顺序的相关文章

静态代码块和构造器的执行顺序

这段时间在学习ContentProvider,还是不太明白ContentProvider中数据库是什么时候创建的.经过自己测试,实际上是用户真正插入数据的时候生成的数据库.具体代码见下一篇关于ContentProvider中的数据生成时机的随笔. 现在就说下静态代码块和构造器的执行顺序.实例化一个类A的时候(这里用的是new的方式进行实例化),如果A中有static{},即静态代码块,那么肯定先执行代码块里的代码.然后执行非静态代码块,最后才真正执行构造器里的代码. 实例化一个类A的时候的执行顺

静态代码块、非静态代码块、构造方法的执行顺序

java中经常有一些静态块,这是用来在生成类之前进行的初始化,无论java还C++语言中的static,都是最先初始化好的.结构如下: static { 静态语句代码块 } { 非静态语句代码块 } 异同点 相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋     值. 不同点:静态代码块在非静态代码块之前执行(静态代码块-->非静态代码块-->构造方法).     静态代码块只在第一次new执行一次,之后不在执行,而非静态

Java子父类间静态代码块、非静态代码块、构造方法的执行顺序

子类A继承父类B,A a=new A(); 正确的执行顺序是:父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A构造函数 也就是说非静态初始化块的执行顺序要在构造函数之前. class FatherStaticTest { static { System.out.println("执行父类的静态代码块."); } FatherStaticTest() { System.out.println(&qu

静态代码块(主要是注意执行顺序)

静态代码块在类最初被使用的时候执行一次,在构造函数执行之前执行,而且只执行一次. 只要用到类,哪怕没有new只是声明变量也会被执行但是只执行一次. (静态字段和静态代码块都是在类最初使用的时候执行一次) 1 public class MyJingTaiDaimaKuai 2 { 3 public static int i = test1();//1.最开始执行 4 public int age = test2();//new的时候先执行成员变量的初始化,再执行构造函数 5 6 static My

java静态代码块真的会优先执行吗

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(); } } 正确答案   构造块 构造块 静态块 构造块 静态块:用s

静态 非静态代码块和构造器的执行顺序测试方法

public class Test { static{ System.out.println("静态区"); } { System.out.println("非静态!"); } private int i; public Test(int i) { super(); this.i = i; } public Test() { System.out.println("构造器!!"); } public static void main(String

Java静态代码块、代码块及构造函数执行顺序

根据以下程序进行分析 定义一个父类 package sas.LearnJava; public class ExcuteOrderTest { { System.out.println("我是在父类开始的普通代码块!"); } public ExcuteOrderTest() { System.out.println("我是父类的无参构造函数!"); } public void showSomething() { System.out.println("我

Java静态代码块、构造代码块、构造方法的执行顺序

Java静态代码块.构造代码块.构造方法的执行顺序 静态代码优先于非静态的代码,是因为被static修饰的成员都是类成员,会随着JVM加载类的时候加载而执行,而没有被static修饰的成员也被称为实例成员,需要创建对象才会随之加载到堆内存.所以静态的会优先非静态的. 执行构造器(构造方法)的时候,在执行方法体之前存在隐式三步: 1,super语句,可能出现以下三种情况: 1)构造方法体的第一行是this语句,则不会执行隐式三步, 2)构造方法体的第一行是super语句,则调用相应的父类的构造方法

关于构造代码块、局部代码块和静态代码块的作用和区别

构造代码块: 直接在类中定义且没有加static关键字的代码块称为{}构造代码; 作用:给对象统一初始化数据 public class Demo1 { public static void main(String[] args) { Test test = new Test(3); //构造代码块会在构造函数被调用时执行, 且在这个例子中比"this.id=id;"语句先执行,作用是给对象统一初始化数据; System.out.println(test); } } class Test