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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© CHT 中级黑马   /  2015-3-31 21:46  /  1500 人查看  /  18 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我知道构造代码块优先于构造方法,但为啥呢

18 个回复

倒序浏览
没有为什么,记住就行了
回复 使用道具 举报
底层机制就是这么规定的吧
回复 使用道具 举报
谁告诉你构造代码块优先于构造方法的?
  1. public class Test {

  2.         public static void main(String[] args){
  3.                 new B();
  4.         }
  5. }

  6. class A {
  7.         public A() {
  8.                 System.out.println("A's constructor");
  9.         }
  10.         
  11. }

  12. class B extends A {
  13.         {
  14.                 System.out.println("B's initialization block");
  15.         }
  16.         
  17.         public B() {
  18.                 System.out.println("B's constructor");
  19.         }
  20.         
  21. }
复制代码

输出结果是:
A's constructor
B's initialization block
B's constructor
回复 使用道具 举报
楼上的这个其实也是构造代码块优先于构造函数的,只不过是创建B对象的时候,先创建A对象。
回复 使用道具 举报
这个是java底层的机制决定的,只要记住就行了
回复 使用道具 举报
王小乖 发表于 2015-4-1 11:17
楼上的这个其实也是构造代码块优先于构造函数的,只不过是创建B对象的时候,先创建A对象。 ...

不对。你没分清初始化和创建对象。创建对象时必然会做初始化,但初始化不一定在创建对象时发生。我的举例中,没有new A(),不存在创建A对象的问题。我这个例子的要点在于:B构造函数第一句是编译器自动添加的super(),它会调用父类的构造函数。只有在这一步完成之后,才会执行构造代码块。因此构造代码块优先于构造函数的说法是不成立的
回复 使用道具 举报
LZ其实问的问题有点模糊,构造代码块要看在父类里还是子类里面 ,如果在子类里面是先执行父类的构造函数,因为先有父亲才能有孩子,如果构造代码块在父类里,jvm虚拟机加载父类的时候肯定是先执行代码块再执行构造方法的。
执行顺序:
父类静态代码块
子类静态代码块
父类普通代码块
父类构造函数
子类普通代码块
子类构造函数
子类普通方法
子类Hello World!
回复 使用道具 举报
我知道1+1=2,但为啥呢
回复 使用道具 举报
8楼正解 刚验证过
  1. class FuLei{
  2.         static{
  3.                 System.out.println("父类静态代码块");
  4.         }
  5.         FuLei(){
  6.                 System.out.println("父类构造函数");
  7.         }
  8.         {
  9.                 System.out.println("父类构造代码块");
  10.         }
  11. }
  12. class ZiLei extends FuLei
  13. {
  14.         static{
  15.                 System.out.println("子类静态代码块");
  16.         }
  17.         ZiLei(){
  18.                 System.out.println("子类构造函数");
  19.         }
  20.         {
  21.                 System.out.println("子类构造代码块");
  22.         }
  23.         public static void function(){
  24.                 System.out.println("子类一般方法");
  25.         }
  26.        
  27. }
  28. public class DaiMaKuaiTest {

  29.         /**
  30.          * @param args
  31.          */
  32.         public static void main(String[] args) {
  33.                 // TODO Auto-generated method stub

  34.                 ZiLei zi=new ZiLei();
  35.                 zi.function();
  36.                
  37.         }

  38. }
复制代码


父类静态代码块
子类静态代码块
父类构造代码块
父类构造函数
子类构造代码块
子类构造函数
子类一般方法
回复 使用道具 举报
这是java语言的规则,它就是按这样的机制运行的。
回复 使用道具 举报
就是优先。。。没辙。。。。【数字君】
回复 使用道具 举报
对象一建立,就会调用与之相应的构造函数,也就是说,不建立对象,构造函数时不会运行的。对象一建立就运行构造代码块了,而且优先于构造函数执行。
回复 使用道具 举报
对,就是这么回事,暂且记住先,到了一定的时候自然就懂了
回复 使用道具 举报
fantacyleo 发表于 2015-4-1 10:11
谁告诉你构造代码块优先于构造方法的?

输出结果是:

谁告诉你你这个不是构造代码块优先于构造函数了。你用了继承所以才线打印出A了。
回复 使用道具 举报
正常的代码如果没有继承,静态代码块优先于构造代码块,构造代码块优先于构造函数。你非要继承完了再说构造代码块不是优先于构造函数也没办法。

你创建对象的时候,子类一定会访问父类,所以父类的静态代码块执行了,然后执行子类的静态代码块,然后是父类的构造代码块,构造函数,子类的构造代码块,构造函数。。这个还不明显?

10楼的函数明显说明了这一点
回复 使用道具 举报
luoyu1530 发表于 2015-4-1 22:36
谁告诉你你这个不是构造代码块优先于构造函数了。你用了继承所以才线打印出A了。 ...

构造函数第一句要么是调用本类其他构造函数要么是调用父类构造函数,如果是调用本类其他构造函数最终也要调用父类构造函数。什么叫“用了继承才先打印出A”?这就是Java的规定。如果不是这样的顺序,那么抱歉,那不是Java。
回复 使用道具 举报
fantacyleo 发表于 2015-4-1 23:02
构造函数第一句要么是调用本类其他构造函数要么是调用父类构造函数,如果是调用本类其他构造函数最终也要 ...

找你这样说,如果不去继承那么静态代码块>构造代码块>构造函数该怎么解释?
回复 使用道具 举报
luoyu1530 发表于 2015-4-1 23:12
找你这样说,如果不去继承那么静态代码块>构造代码块>构造函数该怎么解释? ...

哪有不继承的?Java中所有类都是Object的子类。只要承认:1. 调用父类构造函数的语句是构造函数的一部分 2. 调用父类构造函数先于构造代码块执行 就可以得出结论:构造代码块并不优先于构造函数执行。起码这种“优先”的说法是不严谨的。我还是拿Java语言规范说话吧:

以上,执行顺序很清楚了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马