interface A{
void ma(String...names);
void ma(String...names);
//这句说明里面有不定个数的String类型的参数,相当于规定了数组个 元素的类型
a.ma("Tom","Billy","Nancy");//这里是虚方法调用吗?
你这个有点像上转型,第二句不是虚函数调用,因为虚函数没有任何实际功能,所以如果是虚函数,那么你这句执行就有问题了。
B b = new B();
b.ma("Tom","Billy","Nancy");//这句为什么能运行 !!!!!!这个能运行是因为B类型的b实现了无功能的虚方法,所以它调用的是实例方法,所以能运行
a.ma("Tom","Billy","Nancy");//这里是虚方法调用吗?
你这个有点像上转型,第二句不是虚函数调用,因为虚函数没有任何实际功能,所以如果是虚函数,那么你这句执行就有问题了。
B b = new B();
b.ma("Tom","Billy","Nancy");//这句为什么能运行 !!!!!!这个能运行是因为B类型的b实现了无功能的虚方法,所以它调用的是实例方法,所以能运行
我的理解
a.ma("Tom","Billy","Nancy");//这里是虚方法调用吗? 这里调用的是你在之类中重写后的方法。
如果子类重写了父类的方法,那么子类的方法会覆盖父类的方法,但是属性不会覆盖。也就是一个子类的对象向上转型为1个父类的对象后,他调用的应该是他重写后的方法(因为父类方法被覆盖了),但是属性是父类的属性。
你可以联想下内存模型
b.ma("Tom","Billy","Nancy")// 此方法已经被之类重写
interface A{
void ma(String...names);
}javac A.java
javap A
Compiled from "A.java"
interface A{
public abstract void ma(java.lang.String[]);
}
java里面这个不叫virtual function,这个叫方法的overwrite
虚方法调用(Virtual Method Invocation):在多态情况下,一个引用类型的变量如果声明为父类的类型,但实际引用的是子类对象,则该变量就不能再访问子类中添加的属性和方法。可是如果此时调用的是父类中声明过、且在子类中又重写过的方法,则在运行时会根据对象真正的类型自动匹配调用不同层次类中的功能方法。 这种机制称为虚方法调用
声明:虚方法调用并不违背多态机制。
摘自《Java SE应用程序设计》 张利国 刘伟
推荐一下:这是一本好书,入门的同学可以好好看下。。
United States Patent 6507946
http://www.freepatentsonline.com/6507946.html