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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


  1. class Base{
  2.         private int i = 2;
  3.        
  4.          Base(){
  5.                 System.out.println("base:"+this.i);  //
  6.                 this.display();
  7.         }

  8.         public void display(){
  9.                 System.out.println("base display:"+this.i); //
  10.         }
  11. }
  12. class Derived extends Base {
  13.          public int i = 22;

  14.          public        Derived(){
  15.                 super();
  16.                 i = 222;        //
  17.          }
  18.          public void display(){
  19.                 System.out.println("derived display:"+i);
  20.          }
  21. }

  22. class TestI {
  23.         public static void main(String[] args){
  24.                 new Derived();
  25.         }
  26. }
复制代码


//问:打印结果?

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

10 个回复

正序浏览
faith 中级黑马 2014-4-15 08:47:17
11#
我有必要 好好看看  视频  有没有配套书籍推荐
回复 使用道具 举报
王春蕾 发表于 2014-4-14 22:50
请问这个内容是在第几天的内容啊?

第6天,第7课
回复 使用道具 举报
chen_x 中级黑马 2014-4-15 00:29:21
9#
本帖最后由 chen_x 于 2014-4-15 00:34 编辑
  1. //验证一个有父类的java对象的初始化顺序
  2. class InitFu{
  3.     public static String staticFuField = "父类静态变量";
  4.     public String field="父类成员变量";
  5.     public int f;
  6.     static{
  7.             System.out.println(staticFuField);
  8.         System.out.println("父类静态初始化块");
  9.     }// 静态初始化块
  10.     {
  11.         System.out.println("父类成员变量默认值:"+f);      
  12.             System.out.println(field);
  13.         System.out.println("父类构造代码块");
  14.     }// 初始化块
  15.     InitFu(){
  16.         System.out.println("Fu类初始化");
  17.     }
  18. }
  19. public class InitStatic extends InitFu
  20. {
  21.         public static String staticField = "子类静态变量";// 静态变量
  22.     public String field = "子类成员变量";// 变量
  23.     public int z;
  24.     static{
  25.             System.out.println(staticField);
  26.         System.out.println("子类静态初始化块1,位置在前");
  27.     }// 静态初始化块
  28.     {
  29.         System.out.println("子类成员变量还是默认值:"+z);
  30.             System.out.println(field);
  31.         System.out.println("子类构造代码块1,位置在前");
  32.     }// 初始化块
  33.     static{
  34.         System.out.println("子类静态初始化块2,位置在后");
  35.     }// 静态初始化块
  36.     public InitStatic() {
  37.             System.out.println("子类构造函数");
  38.     }// 构造函数
  39.     public static void main(String[] args) {
  40.         new InitStatic();
  41.     }  
  42.     {
  43.             //System.out.println(field);
  44.         System.out.println("子类构造代码块2,位置在后");
  45.     }// 初始化块
  46. }
  47. 运行结果是:
  48. 父类静态变量
  49. 父类静态初始化块
  50. 子类静态变量
  51. 子类静态初始化块1,位置在前
  52. 子类静态初始化块2,位置在后
  53. 父类成员变量默认值:0
  54. 父类成员变量
  55. 父类构造代码块
  56. Fu类初始化
  57. 子类成员变量还是默认值:0
  58. 子类成员变量
  59. 子类构造代码块1,位置在前
  60. 子类构造代码块2,位置在后
  61. 子类构造函数
复制代码

王春蕾 发表于 2014-4-14 22:34

我没啥指正,就是希望下次代码写在回复的插入代码里面,这样看着不好看 ...

这个那会没注意就点回复了,更正下~


回复 使用道具 举报
结果有点意外但是想了想,有点感想,最后的0是没什么意外的,因为对象创建会执行类中的构造函数,构造函数没执行完对象还没还没建立,所以没有初始化,打印出0是正常的!至于前面打印出2,我感觉也应该是0,但是结果却是2,我想只能说是base是父类方法,调用的是自己的成员变量
回复 使用道具 举报
chen_x 发表于 2014-4-14 15:55
不考虑继承时,对象初始化的过程在视频中都有,考虑继承时,java对象的初始化过程,也可以先用代码验证一下 ...

请问这个内容是在第几天的内容啊?
回复 使用道具 举报
chen_x 发表于 2014-4-14 15:55
不考虑继承时,对象初始化的过程在视频中都有,考虑继承时,java对象的初始化过程,也可以先用代码验证一下 ...

我没啥指正,就是希望下次代码写在回复的插入代码里面,这样看着不好看:lol
回复 使用道具 举报
ithmC4 发表于 2014-4-14 14:59
有意思,想不明白,为什么会有这种结果

这段代码必须有意思,技术含量很高的
回复 使用道具 举报
不考虑继承时,对象初始化的过程在视频中都有,考虑继承时,java对象的初始化过程,也可以先用代码验证一下:
//验证一个有父类的java对象的初始化顺序
class InitFu{
    public static String staticFuField = "父类静态变量";
    public String field="父类成员变量";
    public int f;
    static{
            System.out.println(staticFuField);
        System.out.println("父类静态初始化块");
    }// 静态初始化块
    {
        System.out.println("父类成员变量默认值:"+f);      
            System.out.println(field);
        System.out.println("父类构造代码块");
    }// 初始化块
    InitFu(){
        System.out.println("Fu类初始化");
    }
}
public class InitStatic extends InitFu
{
        public static String staticField = "子类静态变量";// 静态变量
    public String field = "子类成员变量";// 变量
    public int z;
    static{
            System.out.println(staticField);
        System.out.println("子类静态初始化块1,位置在前");
    }// 静态初始化块
    {
        System.out.println("子类成员变量还是默认值:"+z);
            System.out.println(field);
        System.out.println("子类构造代码块1,位置在前");
    }// 初始化块
    static{
        System.out.println("子类静态初始化块2,位置在后");
    }// 静态初始化块
    public InitStatic() {
            System.out.println("子类构造函数");
    }// 构造函数
    public static void main(String[] args) {
        new InitStatic();
    }  
    {
            //System.out.println(field);
        System.out.println("子类构造代码块2,位置在后");
    }// 初始化块
}
运行结果是:
父类静态变量
父类静态初始化块
子类静态变量
子类静态初始化块1,位置在前
子类静态初始化块2,位置在后
父类成员变量默认值:0
父类成员变量
父类构造代码块
Fu类初始化
子类成员变量还是默认值:0
子类成员变量
子类构造代码块1,位置在前
子类构造代码块2,位置在后
子类构造函数
这样再分析楼主的代码就容易理解了:
  1. class Base{
  2.         private int i = 2;//1.最先执行的
  3.         
  4.          Base(){ //2. 第2个顺序执行的,虽然Derved类的构造函数中把super()写在第一行,但不是说是执行到Derived()后才执行父类构造函数
  5.                 System.out.println("base:"+this.i);  //打印:base:2,因为Base()方法执行是在父类中,所以这里的i是父类的,不是子类的。
  6.                 this.display(); //这里调用的是子类的display()方法,因为内存中只有一个子类对象,this就是指向子类对象,而且子类复写了display()方法,这是多态特征,调用的是的子类方法。
  7.         }
  8.         public void display(){
  9.                 System.out.println("base display:"+this.i);
  10.         }
  11. }
  12. class Derived extends Base {
  13.          public int i = 22;
  14.          {
  15.                System.out.println(i+"ooooo");
  16.          }
  17.          public Derived(){
  18.                 super(); //
  19.                 System.out.println(i+"ccccc");
  20.                 i = 222;        
  21.          }
  22.          public void display(){ //3. 从上面的顺序2跳转到这里执行
  23.                 System.out.println("derived display:"+i); //因为display()这个函数是在父类构造函数中执行的,Base()还没执行完,子类自己的成员变量i还没有显示初始化,还是默认值
  24.          }
  25. }
  26. class TestI {
  27.         public static void main(String[] args){
  28.                 new Derived();
  29.         }
  30. }
复制代码

欢迎指正~

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

回复 使用道具 举报
有意思,想不明白,为什么会有这种结果
回复 使用道具 举报
base:2
derived display:0
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马