class Base {    private int val;
    public Base(){
       val = lookup();
    }
    
    public  int lookup(){
       return 5;
    }
    
    public int getVal(){
       return val;
    }
}
public class Derived extends Base{
    
    public int num =10 ;
    public  int lookup(){
       return num;
    }
    
    public static void main(String[] args){
       Derived d = new Derived();
       System.out.println("From main() d.getVal() returns "+d.getVal());
    }   
}运行结果:From main() d.getVal() returns 0
为什么是结果是0呢?
请赐教。

解决方案 »

  1.   

    你的Derived类是继承自Base类
    d.getVal()调用的是继承自父类的方法,val你没有初始化所以默认就是0啊
      

  2.   

    当创建Derived对象时会先创建父类Base的实例,由于int lookup()在子类Derived中被覆写了,在父类构造函数中调用lookup()函数时会直接调用子类的,由于此时子类Derived被未创建实例,num的数值为0(由系统自动初始化),这样val的数值也被初始化成了0。父类对象创建完成后,开始创建子类对象,此时才给num初始化成10,当调用d.getVal()返回的是子类对象创建完成之前num的初始值,也就是0。ps,这个谜题在java解惑中有详细的讲解,楼主可以参考下
      

  3.   


    Derived d = new Derived();
    //会执行父类的无参数的构造函数,
    //而且Derived类覆盖父类的lookup()
    //所以当执行父类的的无参构造方法时val = lookup();
    //lookup()其实是调用的子类Derived的方法
    public  int lookup(){
           return num;
    }
    //而这时候num还未初始化所以默认0
    //因此val=0
      

  4.   

    你都没有调用public Base()方法,val的值当然还是默认值0而不是10;
      

  5.   

    执行这个的时候
        public  int lookup(){
           return num;
        }
    num还没有初始化呢,即 num =10 ;还没有被执行,只是为num分配了空间,它的值初始值为0。
      

  6.   

    父类val没有初始化直接输出初始化0了
      

  7.   


    正解!!!是子类中num没有赋值,只是初始化为0,然后lookup返回的就是0。你可以研究一下初始化顺序的。class P {
    static String ps1 = "ps1";
    String ps2 = "ps11";

    {
    System.out.println(ps1);
    ps1= "ps1--";
    }

    public P() {
    System.out.println(ps1);
    System.out.println("p--"+getPs());
    System.out.println("p--"+getPss());
    } public String getPs() {
    return ps1;
    }
    public String getPss() {
    return ps2;
    }
    }class C extends P {
    static String ps1 = "ps2";
    String ps2 = "ps22";

    {
    System.out.println(ps1);
    ps1 = "ps2--";
    }

    public String getPs() {
    System.out.println("zhixing");
    return ps1;
    }

    public String getPss() {
    System.out.println("zhixing-sss");
    return ps2;
    }

    public C() {
    System.out.println(ps1);
    }
    }
    // new P();
    //output:~
    /*
    ps1
    ps1--
    zhixing
    p--ps2
    zhixing-sss
    p--null
    ps2
    ps2--
    */
      

  8.   

    class Base {    private int val;
        public Base(){
           val = lookup();
           System.out.println("Base constructor ! val:"+val);
        }
        
        public  int lookup(){
         System.out.println("Base lookup!");
           return 5;
        }
        
        public int getVal(){
           return val;
        }
    }
    public class Derived extends Base{
        
        public int num =10 ; public Derived() {
         System.out.println("Derived constructor! num:"+num);
    } public  int lookup(){
         System.out.println("Derived lookup! num: " + num);
           return num;
        }
        
        public static void main(String[] args){
           Derived d = new Derived();
           System.out.println("From main() d.getVal() returns :"+d.getVal());
        }   
    }运行结果:
    Derived lookup! num: 0
    Base constructor ! val:0
    Derived constructor! num:10
    From main() d.getVal() returns :0结果分析:
    因为Derived 类继承了Base类,所以在实例化Derived类时会先实例化Base类。
    在调用Base类无参构造方法时,调用了子类的lookup()方法,由于Derived 类还没有被实例化,所以num的默认值就是0。
    执行完Base类的构造方式时,Base类的val也就有了值0;
    当Base类实例化完成之后会调用子类的无参的构造方法,这时候Derived类被实例化num被赋值为10;
    最后输出的时候调用的是父类的getVal()方法,所以输出的值也就是0了;
      

  9.   


    同意这个,楼主不如debug一下吧,设置断电看数值
      

  10.   

    设计这样继承太混乱了
    class Base {
        private int val;
        public Base(){
           val = lookup();
        }
        
        public  int lookup(){
           return 5;
        }
        
        public int getVal(){
           return val;
        }
    }public class Derived extends Base{
        public  int lookup(){
           return 10;
        }
        public static void main(String[] args){
           Base d = new Derived();
           System.out.println(d.getVal());
        } 
    }
      

  11.   

    这个程序完整的复制到eclips中就有报错。
    package study;public class Base {    private int val;
        public Base(){
           val = lookup();
        }
        
        public  int lookup(){
           return 5;
        }
        
        public int getVal(){
           return val;
        }
        public static void main(String[] args){
            Xa d = new Xa();
            System.out.println("From main() d.getVal() returns "+d.getVal());
        }   
    }
     class Xa extends Base{
        
        public int num =10 ;
        public  int lookup(){
           return num;
        }
        
    }
      

  12.   

    return num ;num 不是被赋值了吗??int num=10;不是被赋值了吗 为什么部是10??