在类A中为什么执行showX() 方法是执行类B中的ShowX() 方法,在new 一个B对象之前,不是应该先执行父类 A的构造方法吗? 在这个时候类B的实例还没有被创建,如何执行B实例中的方法了? 求高手指点
public class test
{
    public static void main(String[] args)
    {
        B b = new B(0);
    }
}class B extends A
{
    B(int x)
    {
        x = x + 2; // 只对局部x操作
        showX();
    }
    public void showX()
    {
        System.out.println("B.x=" + x);
    }
}class A
{
    public static int x = 2;    A()
    {
        x = x + 1;      
        showX();
    }
    public void showX()
    {
        System.out.println("A.x=" + x);
    }
}

解决方案 »

  1.   

    首先你的main()方法执行的时候,创建B的时候带了参数0,虽然你继承了A类,但是不满足A类的构造方法,肯定不会执行,那只有满足B的构造方法,所以执行了B的构造方法。
      

  2.   

    对的~  这种问题 你debug跟一遍就知道了
      

  3.   


    啥玩意啊  new  一个B对象的时候肯定会执行B的构造方法啊,  我是说在执行A构造方法的时候,里面有一个方法 ShowX()  , 为什么B的 而不是A的
      

  4.   


    如果这样写  A a  = new B();
    a.ShowX();我知道这个是多态的,但是在A构造函数里面执行的时候,B对象不是还没有创建吗?
      

  5.   

    关于构造函数,说明3 点:(1) 对象是由 new 运算符创建的,且在任何构造函数执行之前就已经创建完毕了; 
    (2) 构造函数的执行总是 “ 向上 ” 的:而且总是先执行完父类的构造函数; 
    (3) 显式初始化语句总是先于构造函数语句,但后于 super() 或 this() 。看了第一点,楼主明白了吗?
      

  6.   

    是还没创建,你在调的过程就是创建过程,你调用ShowX(),它是用到动态绑定机制,它关心的不是你对象出来了没,是关心你要创建的对象它所属类的,然后再去这个所属类中调用ShowX()实例方法
      

  7.   


    这还对?我不知道你两个星是哪来的。你看下下面代码public class MyJava
    {
        public static void main(String[] args)
        {
            B b = new B(0);
        }
    }class B extends A
    {
        B(int x)
        {
            System.out.println("B");
        }
    }class A
    {
        A()
        {
            System.out.println("A");
        }
    }
      

  8.   


      B(int x)
        {
            x = x + 2; // 只对局部x操作
            showX();
        }
       
    其实等价于:
      B(int x)
        {
           super();
            x = x + 2; // 只对局部x操作
            showX();
        }
        楼主的理解也没错,B初始化的时候,先去调用父类的构造函数。。也就是AA() {
    x = x + 1;
    showX();
    }
    实际上是:A() {
    x = x + 1;
    this.showX();
    }
    但是此时的this 显然是B的实例由于B已经重写了showX()方法,所以调用的是他本身的showX();
      

  9.   

    方法存在于代码区,所以一旦B实例创建,方法就会加载到代码区,以后即使创建多个B实例,也只会有一份代码指令。
    当B实例被创建的时候,B实例本身可能还没有被完全创建,但是不影响代码区的代码指令加载,因为B实例最终存在堆区,这种情况,只会影响B实例的数据区,即B的属性的赋值(初始化等)
      

  10.   

    宝哥的解释是比较底层,从JVM 内存的角度来解释的。。估计楼主听不懂
      

  11.   

    是我太激动了,对不起向“feifeikub”及“zn85600301”至歉。