class Base{
int i=99;
public void amethod(){
System.out.println("Base.amethod()");;
}
Base(){
amethod();
}
}
public class Derived extends Base {
    int i=-1;
    
public static void main(String[] args) {
// TODO Auto-generated method stub
    Base b=new Derived();
    System.out.println(b.i);
b.amethod();
}
   public void amethod(){
   System.out.println("Derived.amethod()");
   }
}

解决方案 »

  1.   

     原因是这段代码创建了一个 Derived 类的实例但是把它赋予一个指向Base 类的引用。 
        在这种情况下,涉及的任何域,比如i,都会指向Base 类中的值,但是方法的调用将 
    会指向实际类(Derived)中的方法而不是引用句柄(Base)中的方法。 
      

  2.   

    emethod() 在哪调用都是一样的结果吗?
      

  3.   

    只要你用Derived的实例去调它,都一样
      

  4.   

    结果:
    Derived.amethod()
    99
    Derived.amethod()我想这是一个在继承中多态的表现
    父类的非私有化属性和方法可以默认继承到子类。
    父类的构造方法子类不可以继承,更不存在覆盖的问题。(非构造方法可以)
     
    当构造一个对象的时候,系统先构造父类对象,再构造子类对象。 
    构造一个对象的顺序:(注意:构造父类对象的时候也是这几步) 
    ① 递归地构造父类对象; 
    ② 顺序地调用本类成员属性赋初值语句; 
    ③ 本类的构造方法。所以构造方法先运行父类再运行子类是因为构造方法是无法覆盖的
    所以结果:
    第一行:其实是调用了父类的构造方法,再由构造方法调用定义的这个方法
    有因为调用了相同的方法,这里子类覆盖了父类的方法。所以出现了子类方法的结果。第二行:但是不能重写父类中的属性的值,这就是为什么调用了b.i的时候是调用的父类的中的i的值,第三个:是直接调用了父类中被覆盖的方法,其实和构造方法是相同的结果,只是方式不同。至于你说的 amethod()在哪调用是不是一样的结果不知道你指的‘哪’是在哪里呢?
    但我做了一个实验:就是将
     
    Base b=new Derived(); 
    System.out.println(b.i); 
    b.amethod(); 
    第一行改成:Derived b=new Derived();下面相同出现的结果是:
    Derived.amethod()
    -1
    Derived.amethod()
    这里说明了Derived 类的实例但是把它赋予一个指向Derived类的引用所以i是指向Derived中的值。
      

  5.   

    其它二行我能理解   b.i输出为 99打击我了...
    楼上的能说明白些吗,
      "第二行:但是不能重写父类中的属性的值,这就是为什么调用了b.i的时候是调用的父类的中的i的值, "
       为什么不能新给值?? 看来我要重新复习下向上转型的知识了