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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© (_演绎、青春 中级黑马   /  2014-9-20 12:13  /  1610 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Super{
  2.         int i = 10;
  3.         //这里是无参构造吗?
  4.         Super(){
  5.                 print();
  6.                 i = 20;
  7.         }
  8.         void print(){
  9.         System.out.print(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.print(j);
  20.         }
  21.         public static void main(String[]args){
  22.         //这是匿名内部类吗?能直接调用j吗?
  23.         System.out.print(new Sub().j);
  24.         }
  25. }
复制代码


最后结果为:03040
0是怎么来的呢?
请大神帮忙详细分析下,谢谢。

4 个回复

倒序浏览
首先需要明白几个关键点,子类,父类的执行顺序,成员变量开辟空间和赋值时机。第一执行的肯定是 为变量和方法开辟内存空间,第二按照继承顺序 逐步往下执行,在执行构造方法之前 先为 类所在层次的 变量赋值;第三 执行构造方法,如果构造方法体里面,包含被子类 重载的方法,那么执行的是 子类的所覆盖的方法。我是按照断点调试的方法得出的,在i ,j 变量,父类的print()分别设定断点,你也可以用这种方法试试。
根据题目的执行顺序如下:
1、为子类变量  j  和父类 i  开辟内存空间
2、执行 父类Super的 构造方法  
2.1 执行print() ,由于Super的 print()  被重载,所以执行的是  Sub 类中 的 print()  ,由于此时 J 只开辟了空间,尚未赋值,所以为 0,因而第一被打印出来的是 0 ;
3、执行  Sub  类的构造方法 ,在 执行 Sub  类 的构造方法之前就已经 为 j 变量赋值了。接下来的程序,自然不用我说了;
         
回复 使用道具 举报
荣英洁 发表于 2014-9-20 13:07
首先需要明白几个关键点,子类,父类的执行顺序,成员变量开辟空间和赋值时机。第一执行的肯定是 为变量和 ...

谢谢:handshake
回复 使用道具 举报
楼上说的很详细,其实我建议你再看看视频、
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马