class Base{
int i =99;
public void amethod(){
System.out.println("Base.amethod()");
}
}
public class RType extends Base{
int i =-1;
public static void main(String []args){
Base b = new RType ();
System.out.println(b.i);
b.amethod();
}
public void amethod(){
System.out.println("RType.amethod()");
}
}最后结果是:
99
RType.amethod()");对于Base b = new RType ();这一句b到底是属于谁的对象?为什么b.i=99 但是却调用了RType的方法?

解决方案 »

  1.   

    Base b, 因为你初始化 Base的时候用RType ,所有要调用RType 的方法、
      

  2.   

    public void amethod()方法被覆盖
    属性不能被覆盖
    ((RType) b).i == -1
      

  3.   

    对于Base b = new RType ();这一句b到底是属于谁的对象?
    当然是子类的对象;即 RType
    为什么b.i=99 但是却调用了RType的方法?
    Java里方法是动态绑定的,不管引用是父类类型还是子类的
    调用方法都是子类的(重写的方法);
    至于为什么b.i=99 是因为父类的引用只能指向父类的成员
    这里叫 擦除 
    想显示子类的属性 就得 ((RType) b).i ;
    如果 RType b = new RType ();想调用父类的属性就得 ((Base)b).i 这叫恢复
    其实b里有两个 i 在堆中以 super.i 和 this.i 分辨的
    记着一句话
    方法决定于对象类型BTW  不建议在子类中用和父类同名的成员属性
    同名属性决定于引用类型
      

  4.   


    tks学习你的态度和技术!
      

  5.   

    对于Base b = new RType ();这一句b到底是属于谁的对象?
    这里是多态,多态的条件有三个:继承、重写、父类的引用指向子类对象。这里满足这三个条件。所以b是类RType的对象
      

  6.   

    我怎么感觉都不像,如果是子类对象的话,如果子类中还有其他的一个方法
    在RType中
    class RType  extends Base
    {
       other(){
        }
    }
    你能够通过
    b.other();访问么?
    个人感觉应该是父类对象的引用