黑马程序员技术交流社区

标题: 执行主函数之前就已经初始化静态代码块了 [打印本页]

作者: 乔青山    时间: 2014-2-26 09:44
标题: 执行主函数之前就已经初始化静态代码块了
本帖最后由 乔青山 于 2014-2-26 12:17 编辑

昨天问过一次,不知道为什么没人回答,急着做笔记,所以再简化的问一下。

这是从毕老师视频上截的图
毕老师讲过,静态代码块的执行优先于主函数。
但是,在图中的步骤中,执行1的时候已经执行了主函数
所以1和2是不是反了?

作者: zzkang0206    时间: 2014-2-26 11:01
没有错呀
静态static是随着类的加载而加载的 只有先加载了类才能去执行静态代码块的内容
作者: zxg08042810    时间: 2014-2-26 11:08
类是先加载后执行的,所以首先会加载static函数所在类,加载完毕后再运行new创建对象,ok!

作者: wdtdcm    时间: 2014-2-26 11:40
没有错的,
你想,static在类里面,先加载类后,才去找static.你看




作者: 榨菜    时间: 2014-2-26 11:42
  1. class Demo
  2. {
  3.         {
  4.                 static int i = 3;
  5.        
  6.         }


  7.         public static void main(String[] args)
  8.         {
  9.                 //如果main先执行这个就知道了,如果打印出来是3,说明静态代码块先执行
  10.                 System.out.println(Demo.i);
  11.         }
  12. }
复制代码

作者: 乔青山    时间: 2014-2-26 12:08
榨菜 发表于 2014-2-26 11:42

说明不了,因为打印的时候代码块和main函数都执行了,你怎么能判断是谁先执行的呢
作者: 乔青山    时间: 2014-2-26 12:09
zzkang0206 发表于 2014-2-26 11:01
没有错呀
静态static是随着类的加载而加载的 只有先加载了类才能去执行静态代码块的内容 ...

我知道
但是,是静态代码块和主函数谁先的问题。上面的步骤是mian先执行,这没错?
作者: 乔青山    时间: 2014-2-26 12:10
zxg08042810 发表于 2014-2-26 11:08
类是先加载后执行的,所以首先会加载static函数所在类,加载完毕后再运行new创建对象,ok!
...

所以说上面的是反了?
作者: 乔青山    时间: 2014-2-26 12:12
wdtdcm 发表于 2014-2-26 11:40
没有错的,
你想,static在类里面,先加载类后,才去找static.你看

没有错么,是你的思路被老师代沟里了吧。
我问你,不加载类你怎么能够找到主函数,找不到主函数你怎么能执行Person p = new Person();呢?
你如果等Person p = new Person();执行的时候才加载类,那你的主函数从哪来的?不从类里面来?
作者: 乔青山    时间: 2014-2-26 12:13
wdtdcm 发表于 2014-2-26 11:40
没有错的,
你想,static在类里面,先加载类后,才去找static.你看

哦,不对,说的不是一种情况。
我是说静态代码块和main函数在同一类中的时候。
作者: 乔青山    时间: 2014-2-26 12:17
wdtdcm 发表于 2014-2-26 11:40
没有错的,
你想,static在类里面,先加载类后,才去找static.你看

明白了,老师的那个程序主函数在另一个类中。
作者: My_work    时间: 2014-3-7 03:05
乔青山 发表于 2014-2-26 12:13
哦,不对,说的不是一种情况。
我是说静态代码块和main函数在同一类中的时候。 ...

我的理解是,静态成员变量是在它所在的类文件被加载的同时,为它分配了相应的内存空间,而其他非静态成员变量是根据代码从主函数开始执行后,依次加载执行,分配相应内存空间,主函数也是静态的,所以是同时加载的。静态方法只能调用静态成员(静态成员和静态方法)




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2