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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 森仔 中级黑马   /  2012-11-17 19:37  /  2492 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 森仔 于 2012-11-24 23:36 编辑

class  Test
{
  int b=2;
  Test()
  {
          method();
         method2();
//          System.out.println("b2:"+b);
  }
  public void method()
  {
          System.out.println("b1:"+b);
  }
  public void method2()
  {
          System.out.println("b2:"+b);
  }
}
public class TestB extends Test{

        int b=20;
        TestB()
        {
          super();
          System.out.println("b4:"+b);
                //b++;
        }
         public void method()
          {
                  System.out.println("b3:"+b);
          }
        public static void main(String args[])
        {
                new TestB();
        }
}

输出结果为:
b3:0
b2:2
b4:20

为什么 b3=0

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

6 个回复

倒序浏览
黑马吕世成 来自手机 中级黑马 2012-11-17 21:11:37
沙发
因为super中调用的是子类的method方法,而子类中的b此时是默认初始化0,当super执行完返回后,才会执行赋值语句,此时b就等于20了。这就是一个关于初始化过程的问题。来自: Android客户端

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
这是我查书找到的构造器初始化的相关知识,希望可以帮到你。
1,java编译器首先加载TestB类的class文件,在对她进行加载的过程中,编译器注意到它有一个基类,于是继续加载基类。
2,接下来,根基类的static初始化即会被执行,然后是子类的static初始化。
3,必要的类加载完毕后,对象可以被创建了,首先,对象中所有的基本类型都会被设为默认值,然后,基类的构造器会被调用。基类构造器和子类的构造器一样,以相同的顺序来经历相同的过程。在基类构造器完成之后,实例变量按其次序被初始化。最后,构造器的其余部分被执行。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
初始化一个类对象的时候,首先构造这个类的基类,接着初始化这个类的成员变量,最后调用构造函数。这个问题发生在:构造子类的基类时,基类调用的子类的method方法,此时,子类的成员变量还没有被赋值,默认为0. 我是这样理解的。。
回复 使用道具 举报
interface  PCI
{
    public void  open();
    public void  close();
}

class MainBoard
{
    public void run()
    {
        System.out.println(" run ");
    }
    public void userPCI(PCI P)    //PCI p  =  new NetCard()
    {
         if(p!=null)
         {
             p.open();
             p.close();
         }
    }

}

class NetCard implements PCI
{
    public void  open()
    {
       System.out.println(" open ");
    }
    public void  close ()
    {
         System.out.println(" close ");
    }
}

class Demo
{
     public static void main(String args[])
     {
         MainBoard  mb = new MainBoard();
         mb.run();
         mb.userPCI(null);
         mb.userPCI(new NetCard() );
         
     }
   
}

点评

怎么就只贴代码呢?应该讲讲的  发表于 2012-11-21 18:46
回复 使用道具 举报
super();是子类调用的,调用语句里面有method()这个方法。
子类里面也有同名方法method()。调用的时候,会先从自己的类里面找,如果没有,再去父类里面找。
找到子类里面的public void method()
          {
                  System.out.println("b3:"+b);
          }
调用的时候读取的是"b3:"+b   
如果子类继承了父类,父类要先初始化,所以super();要写在第一行,
父类初始化还没有结束,所以子类不能进行初始化int b=20;  
但是int 类型有默认值是0.
所以b这个时候是0.  打印出来就会是  b3=0
                                                                                       可能大概应该就这么个意思,继承我前两天也才看完,如果正确求表扬~~{:soso_e191:}
                                                                                                                                                                     错误求改正~~{:soso_e193:}

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
张硕 中级黑马 2012-11-21 22:26:55
7#
如果有子类继承父类的情况是:
1        子类中的new通过构造器来开辟内存空间,其中包含了父类子对象的空间;
2        new把这个刚刚创建的对象引用给出构造器,new的工作完成了;
3        构造器(非委派)会先去调用父类构造器;
4        父类构造器先执行显示初始化语句;
5        父类构造器再执行自己的方法体内容,父类构造器工作结束了;
6        回到子类构造器,开始执行显示初始化语句;
7        再执行构造器的方法体内容;
8        返回这个引用,结束。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

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