解释一下运行结果: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
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
这个是创建了一个父类对象的引用指向子类,如果从内存去解析就很好理解了 多态的三个必须条件都满足了。。显然是多态
要不是亲眼看到,我确实不知道会有什么样的运行结果
通过实验,根据实验结果总结原因,我想大概是这么个过程:
先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自己的
// 用语很不专业,表意可能也不太准确,各位高人见笑了
// 本人也是新手,但愿不要误导比我更新的新手
Java中除了static和final方法外,其他所有的方法都是运行时绑定的。