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