日期:2014-05-20  浏览次数:20862 次

java 运行时多态问题
下面这段代码的运行结果我和看的一本书上的结果不一样,并请大家帮我解释一下这段代码中的运行时多态是怎么一种情况:

Java code

class A0{
    int i,j;
    A0(int i,int j){
        this.i=i;
        this.j=j;
    }
    int add(){
        return i+j;
    }
}
class A extends A0{
    A(int i,int j){
        super(i,j);
    }
    int multiply(){
        return 0;
    }
}
class B extends A{
    B(int i,int j){
        super(i,j);
    }
    int mutliply(){
        return i*j;
    }
}
public class Inheritance2{
public static void main(String [] args){
    A a=new B(6,8);
    System.out.println("i*j="+a.multiply());
    System.out.println("i+j="+a.add());
}
}



实际运行结果是这样的:
i*j=0
i+j=14

那本书上的结果是这样的:
i*j=48
i+j=14

并这样解释:声明类中A类型的变量a,然后建立A类的子类B的一个实例,并把对改实例的引用存储到a中。Java运行时系统分析该引用是类型B的一个实例,因此调用子类B的multiply(),又因为方法add()求被子类B重写,所以运行时系统调用继承的父类A的父类A0的add()方法。


------解决方案--------------------
A a=new B(6,8);
这句调用B的构造器,然后调用A的构造器,再调用A0的构造器,得到一个类B的实例。主时a.i=6,a.j=8。
System.out.println("i*j="+a.multiply());
因为a补申明成类A的变量,,而类A中也确实存在一个叫multiply的方法。虽然是类B的实例,只会调用类A的multiply方法,而不会调用类B的multiply方法(这个好像叫虚方法调用)。是故i*j=0。
System.out.println("i+j="+a.add());
这句就不用解释了解情况吧,呵呵。
i+j=14。
------解决方案--------------------
楼上解释的很详细了~
比较简单的说是:
A a=new B(6,8);
a.multiply();//这里会使用A中定义的multiply(),应为是A a=new B(6,8);
a.add();//A中没覆盖add()方法,这里使用的是父类中的add();

如果是B b = new B(6,8);
结果就应该是
a.multiply();//48
a.add();//14
------解决方案--------------------
mutliply不等于multiply(单词拼写错误)
------解决方案--------------------
a.multiply()

A类中定义的multiply()才是一样的。
B类定义的是mutliply()

对吧!