A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 帅哥哥 高级黑马   /  2014-5-16 17:20  /  1348 人查看  /  3 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

今天看返回去看毕姥爷的视频,看到静态代码块的时候,突然想到构造代码块,有点懵了,于是查了一下,总结如下:
静态代码块:随着类的加载而执行,只执行一次。用于给类进行初始化。
构造代码块:建立对象的时候用于给对象进行初始化。
什么时候会加载类?
使用到类中的内容时加载:有三种情况
1.创建对象:new StaticCode();
2.使用类中的静态成员:StaticCode.num=9;  StaticCode.show();
3.在命令行中运行:java StaticCodeDemo
类所有内容加载顺序和内存中的存放位置:
        利用语句进行分析。
                1.Person p=new Person("zhangsan",20);
                        该句话所做的事情:
                        1.在栈内存中,开辟main函数的空间,建立main函数的变量 p。
                        2.加载类文件:因为new要用到Person.class,所以要先从硬盘中找到Person.class类文件,并加载到内存中。
                                加载类文件时,除了非静态成员变量(对象的特有属性)不会被加载,其它的都会被加载。
                                记住:加载,是将类文件中的一行行内容存放到了内存当中,并不会执行任何语句。---->加载时期,即使有输出语句也不会执行。
                                        静态成员变量(类变量)                ----->方法区的静态部分
                                        静态方法                              ----->方法区的静态部分
                                        非静态方法(包括构造函数)        ----->方法区的非静态部分
                                        静态代码块                                        ----->方法区的静态部分
                                        构造代码块                                        ----->方法区的静态部分
                                       
                                        注意:在Person.class文件加载时,静态方法和非静态方法都会加载到方法区中,只不过要调用到非静态方法时需要先实例化一个对象
                                        ,对象才能调用非静态方法。如果让类中所有的非静态方法都随着对象的实例化而建立一次,那么会大量消耗内存资源,
                                        所以才会让所有对象共享这些非静态方法,然后用this关键字指向调用非静态方法的对象。
       
                       
                        3.执行类中的静态代码块:如果有的话,对Person.class类进行初始化。
                        4.开辟空间:在堆内存中开辟空间,分配内存地址。
                        5.默认初始化:在堆内存中建立 对象的特有属性,并进行默认初始化。
                        6.显示初始化:对属性进行显示初始化。
                        7.构造代码块:执行类中的构造代码块,对对象进行构造代码块初始化。
                        8.构造函数初始化:对对象进行对应的构造函数初始化。
                        9.将内存地址赋值给栈内存中的变量p。
                2.p.setName("lisi");
                        1.在栈内存中开辟setName方法的空间,里面有:对象的引用this,临时变量name
                        2.将p的值赋值给this,this就指向了堆中调用该方法的对象。
                        3.将"lisi" 赋值给临时变量name。
                        4.将临时变量的值赋值给this的name。
                3.Person.showCountry();       
                        1.在栈内存中,开辟showCountry()方法的空间,里面有:类名的引用Person。
                        2.Person指向方法区中Person类的静态方法区的地址。
                        3.调用静态方法区中的country,并输出。
           注意:要想使用类中的成员,必须调用。通过什么调用?有:类名、this、super
          
三、静态代码块、构造代码块和构造函数的区别
                静态代码块:用于给类初始化,类加载时就会被加载执行,只加载一次。
                构造代码块:用于给对象初始化的。只要建立对象该部分就会被执行,且优先于构造函数。
                构造函数:  给对应对象初始化的,建立对象时,选择相应的构造函数初始化对象。               
          创建对象时,三者被加载执行顺序:静态代码块--->构造代码块--->构造函数



3 个回复

倒序浏览
不错 刚刚学过这儿~长知识了~
回复 使用道具 举报
很好,很强大,
回复 使用道具 举报
我去  略强大啊!!代码好长啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马