读书人

java 运行时多态有关问题

发布时间: 2011-12-07 22:35:48 作者: rapoo

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()

对吧!

读书人网 >J2SE开发

热点推荐