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()
对吧!