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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小小 初级黑马   /  2012-6-3 09:46  /  1825 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package com.bag;

  2. class Super {
  3.         int i = 10;
  4.         Super() {
  5.                 print();
  6.                 i = 20;
  7.         }
  8.         void print() {
  9.                 System.out.println(i);
  10.         }
  11. }

  12. public class Sub extends Super {
  13.         int j = 30;
  14.         Sub() {
  15.                 print();
  16.                 j = 40;
  17.         }
  18.         void print() {
  19.                 System.out.println(j);
  20.         }
  21.         public static void main(String[] args) {
  22.                 System.out.println(new Sub().j);
  23.         }
  24. }
复制代码
结果是 0
  30
  40

为什么不是 10
  30
  40

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

4 个回复

倒序浏览
http://bbs.itheima.com/forum.php?mod=attachment&aid=MzEzM3w4N2E2MmZiNmE3ZDdkYTNmOTZlZjFlNGY4NmY0ZWQ0OHwxNzMyNTY2NzM0&request=yes&_f=.png
过程如下:
1. 虚拟机试图访问Sub.main这个静态方法
2. 当一个类第一次被访问的时候,才会被加载,如果有静态变量或称为类变量,那么在此
  加载时会被初始化
3. 加载Sub类的时候,虚拟机注意到它有一个基类Super,那么Super类也会被加载
4. 当new Sub()的时候,第一件事儿就是在内存中划出一块足够存储Sub对象的空间,
  这块空间会被清零,也就是说Sub对象的所有实例变量都会得到一个默认值,对于
  这里的i,j就是0,如果是引用类型就是null
5. 执行Sub构造器,Sub有父类,所以执行Sub构造器的第一步就是执行父类的构造器,
  构造器的执行过程是最让人迷惑的地方,下面试着做一下解释:

  首先要明确构造器的作用,构造器的作用就是初始化对象,而不是创建对象。
  其次要明确,执行构造器时第一要做的就是初始化对象,然后才是运行构造器中的语句。
  什么叫初始化对象呢?就是按照语义从上到下依次执行一下你声明的字段。

jhkj.png (20.95 KB, 下载次数: 65)

jhkj.png

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

回复 使用道具 举报
谢谢,回答的非常满意
回复 使用道具 举报
受益匪浅.....
回复 使用道具 举报
package com.bag;


class Super {

        int i = 10;                                                  //1.3

        Super() {                                                   //1.2

                print();                                              //1.4     这个地方调用子类的print,由于此时子类的J还没有显示初始化,所有输出0

                i = 20;                                             // 1.5

        }

        void print() {

                System.out.println(i);

        }

}


public class Sub extends Super {

        int j = 30;                                              //1.6

        Sub() {                                                 //1.1   

                print();                                         //1.7   这里j已显示初始化为30  所以输出30
   
                j = 40;                                         //1.8

        }

        void print() {

                System.out.println(j);

        }

        public static void main(String[] args) {

                System.out.println(new Sub().j);          //1.0        //1.9这里主函数输出j为40                 

        }

}

希望可以帮到你
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马