java static 语句块中的内容是否被提前执行了?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java static 语句块中的内容是否被提前执行了?相关的知识,希望对你有一定的参考价值。

相当于java编译器把java源文件的指令翻译成字节码,然后
再拿去解释执行。 而Class.forName("oracle.jdbc.OracleDriver");这当中包含了注册驱动的代码在它的static块中。意思就是static...DriverManager.registerDriver(new oracle.jdbc.OracleDriver())...
老师说,“这里Class.forName一定要拿到字节码,必须加载到虚拟机中,那么必须执行static块,而且执行一次。”老师的意思不就是这里的static块在加载到虚拟机中的时候就被执行了?而这是在真正解释执行之前发生的事情。我想我还是没有搞清楚:编译器编译的时候有没有跟内存扯上关系?加载跟翻译成字节码有什么联系?

你好,是这样的,这与java类的初始化顺序有关,下面顺便在提一下。
(1)加载父类(以下序号相同,表明初始化是按代码从上到下的顺序来的)
  1.为父类的静态属性分配空间并赋于初值
  1.执行父类静态初始化块;
(2)加载子类
  2.为子类的静态属性分配空间并赋于初值
  2.执行子类的静态的内容;
(3)加载父类构造器
  3.初始化父类的非静态属性并赋于初值
  3.执行父类的非静态代码块;
  4.执行父类的构造方法;
(4)加载子类构造器
  5.初始化子类的非静态属性并赋于初值
  5.执行子类的非静态代码块;
  6.执行子类的构造方法.
总之一句话,静态代码块内容先执行(父先后子),接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。

二、静态变量和静态代码块的初始化顺序:

  谁在前面先初始化谁(这个也比较容易理解,初始化的时候,不可能跳着去初始化吧,比如说静态代码块在静态变量的前面,不可能先跳过静态代码块的初始化先去执行静态变量的初始化吧。)
========================================================================
首先需要说的是,上面我给你写的你真应该好好读一下。
在回答你补充的问题吧。
1. 编译器编译的时候有没有跟内存扯上关系?
答:严格的说有,任何程序运行都会和内存扯上关系,但是这个问题和编译没有任何关系,编译只是将源文件编译成字节码文件。
2. 加载跟翻译成字节码有什么联系?
答:源文件必须被编译成字节码才可以被加载。当类在加载的时候,就又回来了我上面说的那几个步骤,真的是非常重要,这对你理解java的运行机制是非常有用的。
举个例子吧:
假如你的某个类DB中就写了你说的static代码块。你现在有一个主方法类。
class DB
static
//......

public DB()
// .....



public class BaiduDemo01
public static void main(String[] args)
DB db = new DB() ;


虚拟机在装载BaiduDemo01后,开始执行main方法,当执行到DB db = new DB() ;这句代码的时候,就开始装载DB这个类的字节码,然后就开始初始化DB,比如上面的代码,就回先加载静态代码块,然后才创建这个类的实例对象。
参考技术A static 语句块中的内容不是提前执行, 而是在类被加载的时候执行的。

类的整体对象的实例化分为这样几步:
1.先加载类
2.对static修饰的语句块或属性或方法分配空间, 语句块中的语句会执行。
3.为对象在内存中分配空间。
4.定义对象的属性和方法。
5.调用构造方法给属性赋值。
完成对象的实例化。(说明:没有谈继承的问题,没有说明父子类的实例问题)
望采纳,谢谢追问

照你这么说的话实例化后总该执行其他代码吧。而static语句块却是在你实例化的第一步就执行了。我可以这么说吧。

追答

java运行分为编译器和运行期。
编译器是负责检查语法,准备编译的,java中有很多的编译器语法,例如泛型等。和内存没关系
运行期的时候,已经不是。java文件啦,而是编译后的class文件。
要运行java代码,首先需要加载这个类,然后是解释执行出来的。而在加载类的时候,静态的方法或属性就会分配空间,而静态的语句块就会执行。

参考技术B static
//语句;

里面的语句是在类加载在JVM里面时运行的,所以很提前哦,具体可以看看类加载器那些资料的
是的吧,各位?希望有帮助!

以上是关于java static 语句块中的内容是否被提前执行了?的主要内容,如果未能解决你的问题,请参考以下文章

Java中的static{}子句块

java变量类型

JAVA09异常处理之动手动脑问题

Java中,finally在try语句块中的return前执行还是后执行

Java中,finally在try语句块中的return前执行还是后执行

Java中的异常处理try catch(第八周课堂示例总结)