黑马程序员技术交流社区

标题: 八百里加急!!! [打印本页]

作者: 全海波    时间: 2012-7-7 21:29
标题: 八百里加急!!!
本帖最后由 全海波 于 2012-8-4 09:50 编辑
  1. class Person
  2. {
  3.       public static void main(String[] args)
  4.           {
  5.                 String name;
  6.                static country = "CN";
  7.         static
  8.      {
  9.         ........
  10.      }
  11.            {
  12.                      ...................
  13.           }
  14.    Person()
  15.           {
  16.                 ................
  17.           }
  18.      public static void arr()
  19.            {
  20.                      ..............
  21.            }
  22.            }
  23. }
复制代码
问该函数的执行顺序?那些属性是否为第一个加载进内存呢?
作者: 曹恒业    时间: 2012-7-7 21:39
这是个老问题,论坛里有很多类似的帖子。基本总结如下:
1.       首先加载类到内存中
2.       对于类变量,系统默认初始化为null或0等默认值
3.       执行静态代码块或类变量的显示初始化(代码中谁在前面谁就先执行)
4.       在堆内存中开辟空间,分配内存地址
5.       对于成员变量,首先系统默认初始化为null或者0等默认值
6.       然后执行构造代码块或成员变量显示初始化(代码中谁在前面谁就先执行)
7.       最后才是构造方法初始化
8.       将堆内存中的地址付给栈内存中的引用
以上是看了大家的总结和毕老师在视频里总结的。

还有一些我个人通过网上的查阅,总结的包括父类在内的执行顺序。

总结:深入理解一个类从被JVM装载开始,各种代码的执行顺序。
         被JVM装载->先以后面描述的方式之后执行父类的相关代码->如果有静态初始化,先执行静态初始化,且只执行一次,以后即使有该类实例化,也不会再执行->如果有静态代码块(以与静态初始化一样的方式执行)->如果有new语句带来的实例化,先为成员变量分配空间,并绑定参数列表,隐式或显式执行super(),即父类的构造方法,->执行非静态代码块-〉执行本类的构造函数-〉其他代码。

作者: 康子龙    时间: 2012-7-7 21:55
1main函数在方法区
2name在栈内存留了个地方放引用
3各种static在方法区
然后貌似没了,因为你这没为person类实例化任何对象
这是我的愚见,不对的地方请大家随意拍砖啊

作者: 孙含庆    时间: 2012-7-7 22:26
这个程序貌似不会执行呀。。你是问加载顺序吗??
还有代码块和静态代码块内的“..........”是代码??  还是你为了举例,省略了代码?
LZ 还是放些有诚意的代码吧!
作者: 董深义    时间: 2012-7-7 22:30
1楼总结的很全面,学习了
作者: 邵阳    时间: 2012-7-7 22:38
曹恒业 发表于 2012-7-7 21:39
这是个老问题,论坛里有很多类似的帖子。基本总结如下:
1.       首先加载类到内存中
2.       对于类变量 ...

你这个是引用http://bbs.itheima.com/thread-18696-1-1.html
作者: 曹恒业    时间: 2012-7-7 23:18
邵阳 发表于 2012-7-7 22:38
你这个是引用http://bbs.itheima.com/thread-18696-1-1.html。

呵呵,你真细心,正好印象比较深,加上总结的很精练,就拿来用了。。
作者: 黑马-李勇    时间: 2012-7-8 00:08
例:
class a
{
        public static void main (String[] args)
        {
                int x=1;
                System.out.println("main");
               
        }
        static
        {
        System.out.println("static");
        }
}
至于谁先进内存...这个等高手回,但这个程序的结果是:
D:\Java\jdk1.6.0_10\bin>java a
static
main

下面是课程笔记的总结:
课程        名称                格式                        什么时候执行                给谁初始化
0508        构造函数        函数名()                对象一建立就会调用与        给对应对象初始化
                                                之对应的构造函数
0509        构造代码块        {执行语句}                对象一建立就运行,而        给对象初始化
                                                且优先于构造函数执行。
0606        静态代码块        static{执行语句}        随着类的加载而执行,        给类初始化
                                                只执行一次。
作者: 全海波    时间: 2012-7-8 16:22
那成员变量,比静态代码块执行的还早是吗?




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