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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 于清云 中级黑马   /  2012-4-25 12:33  /  3154 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 于清云 于 2012-4-25 13:47 编辑

构造代码块先于自定义构造函数执行,这个我知道了,但是自定义构造函数跟默认的构造函数之间 哪个先执行呢?

问错了 不好意思哈 大虾们 我想问的是 构造代码块跟默认的构造函数之间 哪个先执行呢?

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

13 个回复

倒序浏览
首先你要清楚他们都是构造函数 ,如果你自定义了构造函数默认的构造函数就不会自动添加
所以构造函数跟默认构造函数 优先级是一样的
回复 使用道具 举报
用来构造对象啊
当你用new关键字时就调用了构造器.
在JAVA里要用构造器构造对象,如果没有显示的声明,
就调用默认的构造器.
回复 使用道具 举报
我勒个擦,这要看你要调用哪个构造函数啊,。。。。
回复 使用道具 举报
一般情况下,在定义类的时候,没有自定义构造方法时,java会默认给这个类一个无参的空构造,在用该类创建对象时,用的是java提供的默认无参空构造。当你自定义构造方法后,java不会再提供无参空构造,这是用该类创建对象时,需要指明自定义构造方法。
回复 使用道具 举报
如果你自定义了构造函数,就不会有默认的空参数构造函数了啊
回复 使用道具 举报
马浩 中级黑马 2012-4-25 13:33:52
7#
没有构造函数的情况下,系统会默认一个空的构造函数来用于初始化,如果你定义的构造函数,系统就不会帮你定义了,也就是这两个不会同时存在
回复 使用道具 举报
孙天 黑马帝 2012-4-25 19:23:53
8#
1,构造函数和一般函数的区别

1,格式:两种函数的格式不同
修饰符 类名(参数列表){}
修饰符 返回值类型 自定义函数名(参数列表)
{
return 返回值:
}
2,运行方式不同
构造函数:对象一创建就会执行对应的构造函数
一般函数:对象创建后在调用一般函数
3,作用不同:
构造函数:是对对应对象进行初始化的。叫做对象一建立时要做什么事情
一般函数:是给对象提供了更多的功能,方便了对象的调用
4,调用次数的不同
构造函数:对象创建时只调用一次。因为对象初始化动作最先执行,只执行一次\


2,构造函数什么时候用
构造函数什么时候用:分析具体事物时,该事物一存在就应该具备一些属性值,或者行为。那就将这些内容都应以在构造函数中

3,构造代码块的作用

定义在类中的代码块叫构造代码块,给所有的类初始化的,先于构造函数
4,this关键字的特点和使用以及应用场景

this代表,this所在函数所述对象的引用。定义功能时,如果功能中用到了本类的对象。这时就用this表示这个对象
this调用构造函数,必须写在第一行。构造函数是用来初始化的,初始化的动作必须先执行   
5,静态和非静态的区别
1,他是一个修饰符,只能修饰成员()2,被static修饰的函数能被所有对象们所共享
被静态修饰的成员多了一种调用方式,就是除了被对象调用意外,还可以被类名直接调用。格式 类名。静态成员
被静态修饰的数据叫共有数据   
4,静态之所以能被类名调用,是因为静态成员是随着类的加载而加载进内存
5,静态优先于对象加载进内存
6,成员变量和静态变量的区别
成员变量和静态变量的区别:
1,成员变量只能被对象所调用。静态成员变量除了可以被对象调用还可以被类名调用
2,成员变量也称为对象变量或实例变量。静态变量也称为类变量。
3,生命周期不同,成员变量随对象出现而出现消失而消失。静态变量随着类的加载而加载消失而消失
回复 使用道具 举报
袁冬梅 黑马帝 2012-4-25 22:26:14
9#
本帖最后由 袁冬梅 于 2012-4-25 22:27 编辑

囧,上面的同学,- -

我来说说吧,我自己稍微理解了一下。
之前我为了理解这个问题写了一个小代码,你也可以参考一下
  1. class Person
  2. {
  3.         private String name;
  4.         Person()
  5.         {
  6.                 this.name = "张三";
  7.                 System.out.println("构造函数执行了!!!!");
  8.         }        
  9.         {
  10.                 System.out.println("这是构造代码块!");
  11.         }
  12.         static
  13.         {
  14.                 System.out.println("这是Person中的Static代码块!");               
  15.         }
  16. }
  17. class Test
  18. {
  19.                 static
  20.                 {
  21.                         System.out.println("这是主函数中的Static代码块11111111");               
  22.                 }        
  23.         public static void main(String[] args)
  24.         {
  25.                 System.out.println("111111111");
  26.                 Person p = new Person();
  27.                 System.out.println("222222222");
  28.         }
  29.         static
  30.         {
  31.                 System.out.println("这是主函数中的Static代码块2222222222");
  32.         }
  33. }
  34. 结果:
  35. 这是主函数中的Static代码块1111111
  36. 这是主函数中的Static代码块2222222
  37. 11111111
  38. 这是Person中的Static代码块!
  39. 这是构造代码块!
  40. 构造函数执行了!!!!
  41. 22222222
复制代码
从以上可以看出执行的顺序是:  主函数中的静态代码块—>主函数—>创建的对象中的静态代码块—>创建的对象中构造函数代码块-->构造函数

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 袁錦泰 于 2012-4-25 23:14 编辑

构造代码块优先于构造函数先执行
我按照优先级把几类代码块为你进行排序:
最先执行的静态(static{})代码块,它的优先级是最高的,它随着类的加载(消失)而加载(消失),作用是为类进行初始化.
其次执行的是构造代码块,虽然它与构造函数一样都是为对象进行初始化,但是它是为所有对象进行统一初始化,而构造函数是进行针对性的初始化.从这一点你也可以自行判定谁的优先级更高一些.
还有一类是局部代码块,它的作用是限制局部变量的生命周期,明确局部变量的作用域.
我只是有针对性的解答了你的问题,但愿你可以理解.如果你觉得还不是很明了,可以直接联系我,我会进一步更详细的为你讲解这个问题!
你可以借助我楼上那位学员写的代码,进行理解.
{:soso_e195:}

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报

还是前两天的那个问题,已经回答过,这里直接简要说了啊!

详细的看袁 锦泰的,说的挺全的,这哥们学的不赖啊

静态代码块随着类的加载而加载,跟着类走。
代码块使用来给对象初始化的,有对象代码块才运行的。


上次那哥们太猛了,整了个这么多代快码的程序,又是静态代码块又是代码块的


不说了直接上图吧!我的图都是自己画的啊 不是抄袭来的e


代码块



前两天那个哥们源码

class Static {

int num = 9;
static {
System.out.println(“a”);
show();
}

{
System.out.println(“c” + num);
show();
}

Static(){
System.out.println(“h”);
}

public static void show(){
System.out.println(“d”);
}
static { System.out.println(“b”); }
}
public class Test{
static {System.out.println(“e”); }

public static void main(String[] args)
{
new Static();
}

static { System.out.println(“f”); }

{ System.out.println(“g”); }
}


回复 使用道具 举报
静态代码块>非静态代码块>构造函数。(>代表执行顺序优先级)
回复 使用道具 举报
构造代码块先于默认函数
回复 使用道具 举报
构造代码块先于默认构造函数,从他们的功能就可以知道啊
构造代码块时是所有对象的共性内容进行初始化,而构造函数是给调用其的对象初始化,比如拿饭卡吃饭,你要先给饭卡充值(构造代码块初始化),才可以吃饭,具体去哪个窗口刷卡就属于构造函数,这样就明了了吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马