下面这段代码的运行结果我和看的一本书上的结果不一样,并请大家帮我解释一下这段代码中的运行时多态是怎么一种情况:
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()方法。

解决方案 »

  1.   

    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。
      

  2.   

    楼上解释的很详细了~
    比较简单的说是:
    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
      

  3.   

    mutliply不等于multiply(单词拼写错误)
      

  4.   

    程序根本没有多态,class A 与 class B 中的两个方法名拼写不一样。
      

  5.   

    a.multiply()

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

  6.   

    jhlava 的眼睛真好啊
      
    的确 ,我开始还没注意
    int multiply()
    int mutliply()2个方法名字不一样; 随便改一个就好了
      

  7.   

    谢谢 大家~~~书上的没有错~~~,是我的方法名打错了,改正之后的的运行结果是:i*j=48 
    i+j=14 
    书上的解释就是正确的~~~