class A{
int a = 3;
public A(){
printA();
}
public void printA(){
System.out.println(a);
}
}
class B extends A{
int a = 6;
public B(){
printA();
}
}
public static void main(String[] args) 
{
A a = new B();
}

解决方案 »

  1.   

    1.父类不能访问子类属性。
    2.这里子类没有重写父类printA()方法
    所有调用的全是父类的printA()方法
      

  2.   

    这样0,6能看明白吗
    class A {
        int a = 3;    public A() {
            printA();
        }    public void printA() {
            System.out.println("a:"+a);
        }
    }class B extends A {
        int a = 6;    public B() {
            printA();
        }    public void printA() {
            System.out.println("b:"+a);
        }    public static void main(String[] args) {
            A a = new B();
        }
    }
      

  3.   


    在初始化B()的时候,先调用A的构造器,在因为B重写了printA()方法,所以在A构造器执行的时候调用了B的printA()方法,而此时B还没有被完全初始化,所以B里面a 变量还是0,第一行就打印出0来。当B构造器执行完毕以后,a被赋值6,所以第二行是6
      

  4.   


    在初始化B()的时候,先调用A的构造器,在因为B重写了printA()方法,所以在A构造器执行的时候调用了B的printA()方法,而此时B还没有被完全初始化,所以B里面a 变量还是0,第一行就打印出0来。当B构造器执行完毕以后,a被赋值6,所以第二行是6
    看懂了点 就是说实例化B的时候 先调用父类构造器 父类构造器调用重写的方法 调用父类构造器时不会初始化已类的属性 只有调用完父类构造器 调用自己的构造器的时候才会初始化属性 对吧
      

  5.   


    在初始化B()的时候,先调用A的构造器,在因为B重写了printA()方法,所以在A构造器执行的时候调用了B的printA()方法,而此时B还没有被完全初始化,所以B里面a 变量还是0,第一行就打印出0来。当B构造器执行完毕以后,a被赋值6,所以第二行是6
    看懂了点 就是说实例化B的时候 先调用父类构造器 父类构造器调用重写的方法 调用父类构造器时不会初始化已类的属性 只有调用完父类构造器 调用自己的构造器的时候才会初始化属性 对吧
    调用父类构造器时 调用的是重写的方法 是不是可以理解为就近调用呢 我还以为调用父类构造器时会初始化父类的属性
      

  6.   


    在初始化B()的时候,先调用A的构造器,在因为B重写了printA()方法,所以在A构造器执行的时候调用了B的printA()方法,而此时B还没有被完全初始化,所以B里面a 变量还是0,第一行就打印出0来。当B构造器执行完毕以后,a被赋值6,所以第二行是6
    看懂了点 就是说实例化B的时候 先调用父类构造器 父类构造器调用重写的方法 调用父类构造器时不会初始化已类的属性 只有调用完父类构造器 调用自己的构造器的时候才会初始化属性 对吧
    调用父类构造器时 调用的是重写的方法 是不是可以理解为就近调用呢 我还以为调用父类构造器时会初始化父类的属性
    调用父类构造器时确实会初始化父类的属性,只是这里调用的不是父类方法
      

  7.   

    用eclipse运行楼主的原代码
    结果是 3  3
      

  8.   


    在初始化B()的时候,先调用A的构造器,在因为B重写了printA()方法,所以在A构造器执行的时候调用了B的printA()方法,而此时B还没有被完全初始化,所以B里面a 变量还是0,第一行就打印出0来。当B构造器执行完毕以后,a被赋值6,所以第二行是6
    看懂了点 就是说实例化B的时候 先调用父类构造器 父类构造器调用重写的方法 调用父类构造器时不会初始化已类的属性 只有调用完父类构造器 调用自己的构造器的时候才会初始化属性 对吧
    调用父类构造器时 调用的是重写的方法 是不是可以理解为就近调用呢 我还以为调用父类构造器时会初始化父类的属性
    调用父类构造器时确实会初始化父类的属性,只是这里调用的不是父类方法
    懂了 谢谢 我代码少写了你也看出来了
      

  9.   


    在初始化B()的时候,先调用A的构造器,在因为B重写了printA()方法,所以在A构造器执行的时候调用了B的printA()方法,而此时B还没有被完全初始化,所以B里面a 变量还是0,第一行就打印出0来。当B构造器执行完毕以后,a被赋值6,所以第二行是6
    看懂了点 就是说实例化B的时候 先调用父类构造器 父类构造器调用重写的方法 调用父类构造器时不会初始化已类的属性 只有调用完父类构造器 调用自己的构造器的时候才会初始化属性 对吧
    调用父类构造器时 调用的是重写的方法 是不是可以理解为就近调用呢 我还以为调用父类构造器时会初始化父类的属性
    调用父类构造器时确实会初始化父类的属性,只是这里调用的不是父类方法
    懂了 谢谢 我代码少写了你也看出来了
    在初始化B()的时候,先调用A的构造器,在因为B重写了printA()方法,所以在A构造器执行的时候调用了B的printA()方法,而此时B还没有被完全初始化,所以B里面a 变量还是0,第一行就打印出0来。当B构造器执行完毕以后,a被赋值6,所以第二行是6
    看懂了点 就是说实例化B的时候 先调用父类构造器 父类构造器调用重写的方法 调用父类构造器时不会初始化已类的属性 只有调用完父类构造器 调用自己的构造器的时候才会初始化属性 对吧
    调用父类构造器时 调用的是重写的方法 是不是可以理解为就近调用呢 我还以为调用父类构造器时会初始化父类的属性
    调用父类构造器时确实会初始化父类的属性,只是这里调用的不是父类方法
    懂了 谢谢 我代码少写了你也看出来了
    对头
      

  10.   

    完整的初始化顺序是:
    父类静态变量
    父类静态块
    子类静态变量
    子类静态块
    父类非静态变量
    父类非静态块
    父类构造函数    第一次
    子类非静态变量
    子类非静态块    
    子类构造函数    第二次第一次是执行父类构造函数时带到了子类重写的printA(),此时子类的a没有初始化默认为0,所以第一行b:0
    第二次是执行子类构造函数,此时已经经过子类非静态变量,所以第二行是b:6
      

  11.   

    是这样的,其实对象类型可以分为编译型类型和运行时类型,
    这里的A a=new B()其实根据引用变量可以判断编译时类型为
    A类,根据new B()可以知道运行时类型为B类,实例化B的时候,
    调用A的构造函数,构造器中掉用的方法其实是运行时类型的方法,也就是
    B类的printa()方法,然而B中的属性a此时还没有初始化,就是你第一个打印结果0.
    然后调用B的构造函数,这个时候,a已经初始化,所以打印结果就是6了;
      

  12.   

    0,6的原因是:子类没有override父类的printA方法,在new 一个B类的时候,并没有newA类,然而却在B类中调用了printA方法,所以会默认先输出0
      

  13.   

    楼主是来逗比的么?
    结果明明是3,3。这样浪费别人时间很不好,csdn很生气,后果很严重。
      

  14.   

    我不知道为什么在我这儿编译不过
    A a = new B();    //     Multiple ers at this line
    - The value of the local variable a is not used
    - No enclosing instance of type Task1 is accessible. Must qualify the allocation with an enclosing instance of type Task1 (e.g. x.new A() where x is an instance of 
     Task1).