黑马程序员技术交流社区

标题: java继承问题 [打印本页]

作者: 小小    时间: 2012-6-3 09:46
标题: java继承问题
  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
作者: 张少威    时间: 2012-6-3 09:55
http://bbs.itheima.com/forum.php?mod=attachment&aid=MzEzM3w2ZjRkMWI2NmM4ZDJkZTgwNTZkODIzMzU4NjgxODlmZHwxNzMxMDYwMTk3&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

作者: 小小    时间: 2012-6-3 10:02
谢谢,回答的非常满意
作者: 蒋映辉    时间: 2012-6-3 15:45
受益匪浅.....
作者: 陌花╮有意、    时间: 2012-6-3 21:33
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                 

        }

}

希望可以帮到你




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2