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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 潘才新 高级黑马   /  2013-7-5 15:57  /  1610 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨兴庭 于 2013-7-5 22:21 编辑

自己笔记出来的, 直接上图了,诚请老师和黑马解惑!

IMG_20130705_155122.jpg (320.69 KB, 下载次数: 1)

--

--

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

8 个回复

倒序浏览
本帖最后由 郑锐 于 2013-7-5 16:13 编辑

第一个问题你说对了。
第二个问题
构造代码块是给所有的对象初始化,就是说你只要创建对象,构造代码块就一定运行。
构造函数是给指定对象初始化用的,就是说创建对象时调用哪个构造函数,就运行哪个构造函数且只运行一个。
总结来说,构造代码块一定会运行,构造函数只有被调用才执行。下面代码运行结果
构造代码块
无参构造函数
-------------我是分割符--------
构造代码块
有参构造函数--------3
  1. <div class="blockcode"><blockquote>public class ReturnThis
  2. {
  3.         {
  4.                 System.out.println("构造代码块");
  5.         }
  6.         ReturnThis(){
  7.                 System.out.println("无参构造函数");
  8.         }
  9.         ReturnThis(int num){
  10.                 System.out.println("有参构造函数--------"+num);
  11.         }
  12.         public static void main(String[] args)
  13.         {
  14.                 ReturnThis rt1=new ReturnThis();
  15.                 System.out.println("-------------我是分割符--------");
  16.                 ReturnThis rt2=new ReturnThis(3);         
  17.         }
  18. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
执行顺序
1. 静态的属性和静态的语句块都是在类加载的时候完成,非静态的东西是在创建对象的时候执行的.
2. 单个类的初始化顺序如下:   静属->静块->非静属->非静块->构造函数.
3. 有继承关系的类的初始化顺序如下:     父静属->父静块->子静属->子静块   ->父非静属->父非静块->父构造->子非静属->子非静块->子构造.  

构造代码块和构造函数的区别:构造代码块是给所有对象进行统一初始化  而构造函数是给对应的对象初始化

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
优先级对着呢!构造代码块是给所有对象初始化。而构造函数是给对应对象初始化,比如:可以有无参构造函数和有参构造函数,不同的对象调用不同的构造函数,但是调用是同一个代码块

评分

参与人数 1黑马币 +3 收起 理由
杨兴庭 + 3

查看全部评分

回复 使用道具 举报
你的笔记写的很清楚。
运行的优先顺序:
static是存放在共享区的,只要类一加载进内存,就会先执行静态代码快。这时对象还没有建立,优先于构造代码块;
构造代码块是在创建对象后才执行的,优先于构造函数;
构造函数是创建对象后,调用就执行,不调用不执行。默认无餐构造函数也在此例,因为一创建对象就会有默认无参构造函数


构造函数和构造代码块都可以给对象初始化;
构造函数在创建对象后,对象调用哪个构造函数,哪个构造函数就运行,不调用不运行。对指定对象初始化;
构造代码块只要在对象创建后就一定会运行,不管你建立多少个对象。用来给所有对象初始化;

评分

参与人数 2技术分 +1 黑马币 +3 收起 理由
郑先明 + 3 总结的到位!
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
为了更好的维护论坛的学习氛围,如果您的的问题“已经解决”请即时联系版主将帖子状态改成“已解决”

-------------------坚持学习,黑马因你而精彩---------------
回复 使用道具 举报
第二点: 关于静态代码块和构造代码块.
        1, 静态代码块.
                作用是:  用于给类进行初始化.
  1. class StaticCode
  2. {
  3.    
  4.     static//静态代码块,随着类的加载而加载.而且只执行一次.
  5.    
  6.     {
  7.         
  8.     }
  9.    
  10. }
  11. class StaticCodeDemo
  12. {
  13.     public static void main(String[] args)
  14.     {
  15.         System.out.println("Hello World!");
  16.     }
  17. }
复制代码
2, 构造代码块.
class Animal
{
    private String eat;
    {//这是构造代码块,作用是给所有对象初始化,存放对象的共性.
        System.out.println("我是一只动物");
    }
    Animal()//这是构造函数,作用是给对应的对象针对性的初始化,存放对象的特性.
    {
         eat="肉";
    }
    Animal(String eat)
    {
         this.eat=eat;
    }
    public void food()
    {
        System.out.println("eat:"+eat);
    }
}
class StaticCodeDemo
{
    public static void main(String[] args)
    {
        Animal c = new Animal();
        c.food();
        Animal d = new Animal("草");
        d.food();
    }
}
输出
我是一只动物
eat:肉
我是一只动物
eat:草

这是我在老师的笔记上自己添加了一点自己比较好理解的话.
至于优先级, 静态代码块只要类一加载, 静态代码块就存在静态区, 而构造代码块,  只要创建了对象就会调用, 构造函数同理, 只是构造代码块是给所有对象初始化,而构造函数是给相对应对象初始化, 所以我的观点是, 按照优先顺序, 应该是 静态代码块>构造代码块=构造函数
如果有那个理解错误, 请大神帮我指出来.

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
楼主您好,我已将您帖子的状态改成“已解决”,对此如有疑问可以通过

QQ632763270和我取得联系

-------------------坚持学习,黑马因你而精彩---------------
回复 使用道具 举报
感谢各位牛人,膜拜啊..
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马