考虑一个超类:
class superclass
{
public void fun() {.....}
}
及其子类:
class subclass extends superclass
{
public void fun(){.......}
public static void main()
{
superclass sup1=new superclass();
sup1.fun()//statement 1
superclass sup2=new subclass();
sup2.fun() //statement 2
subclass sub1=new subclass();
sub1.fun()//statement 3
}
}
我按照以下方式确定语句1,2和3是编译时多态还是运行时多态。
编译器首先确定在调用语句中使用的引用变量的类类型,然后编译器检查源代码中是否存在该基数的派生类,以及是否覆盖了在调用语句中使用的方法或不在派生类中。如果找到了派生类,并且该类包含函数的重写版本,则在运行时确定引用变量所引用的对象的类型,并执行该类的类型函数(运行时多态性),否则该类中存在函数(属于该参考变量)(编译时多态)。
通过这种方式进行: 1)语句1将导致运行时多态。
2)陈述2也将导致运行时多态。
3)陈述3将导致编译时多态。
问题1: 我想知道这种方法是对还是错?
问题2: 当使用函数调用语句代替对象变量返回对象的地址时,将执行什么步骤? 我认为返回地址的函数的返回类型将用于确定多态性的类型。 我说得对吗?
答案 0 :(得分:1)
在Java中,对于任何可覆盖的方法,您始终具有运行时多态!编译器无法知道一个类的所有可能派生类,因此它不能遵循上面的算法。
AFAIK,逻辑如下:
答案 1 :(得分:0)