解释一下运行结果:public class ExecPoly{
public static void main(String[] args){
C cc = new A();
System.out.println(cc.i);
cc.display();
}
}
class C{
int i = 10;
public void display(){
System.out.println("abc");
}
}
class A extends C{
int i = 100;
public void display(){
System.out.println("cba");
}
}运行结果为:
10
cba

解决方案 »

  1.   

    其实这个例子很好说明了多态  还有继承的成员变量的属性  C cc = new A(); 
    这个是创建了一个父类对象的引用指向子类,如果从内存去解析就很好理解了   多态的三个必须条件都满足了。。显然是多态
      

  2.   

    这个例子挺经典的,偷偷记下来了
        要不是亲眼看到,我确实不知道会有什么样的运行结果
            通过实验,根据实验结果总结原因,我想大概是这么个过程:
                先new A(),以类A为摸板创建个实例,这时候实例的变量和方法都是类A中的
                    然后C cc=new A(),把创建的A的实例赋值给C类型的变量,这个时候A类型的对象就要转化(个人觉得叫“退化”更形象些)成C类型的对象,转化的结果大概是这样的:
         1、A类中特有的(C类中没有)变量和方法,都不可见了,不能通过“cc.变量名”、“cc.方法名”的方式访问了
         2、A类C类中公有的变量和方法,变量用C中的,方法用A中的,通过“cc.变量名”方式访问到的都是C中的变量,通过“cc.方法名”方式调用的方法都会执行A类中的方法
         3、A中的方法操作的变量都是A自己的,C中的方法操作的变量都是C自己的
    // 用语很不专业,表意可能也不太准确,各位高人见笑了
    // 本人也是新手,但愿不要误导比我更新的新手    
      

  3.   

    个人也是新手,呵呵也有点自己的看法,当你new A()事在堆空间中是这样  子类((父类i=10, display(abc))i=100,display(cba))这种关系当你调用System.out.println(cc.i),cc.display()这样说吧不管你怎么写编译器只会把cc当做C来看但是他能看到你子类重写的方法:这就是多态。当你重写了就调用子类重写了的,没有就用父类的。
      

  4.   

    属性是静态绑定的
    Java中除了static和final方法外,其他所有的方法都是运行时绑定的。