class Y{
void process(){
System.out.println("In Y process()");
}
}
class I extends Y{
void process(){
System.out.println("In I process()");
}
public static void main(String[] args){
Y y = new I();
y.process();
}
}
这段代码是基于java中的重写。但是我对这个问题有疑问。当我们使用y引用变量调用process方法时,那么这个方法调用是在运行时解决的,还是由编译器解决的?请帮助我解决这个问题,jvm是否解决了要调用哪个process方法,或者它是编译器?给出你的答案的理由。
3条答案
按热度按时间bvpmtnay1#
此调用将在运行时解析。而i类的process()方法将变得异常强大。超类引用引用的是子类对象。因此,当您使用引用子类对象的超类引用调用方法时,总是会执行子类方法。
kqhtkvqz2#
方法是在运行时解析的,您正在扩展一个类,这意味着该类可以具有与父类相同的方法,但引用是在运行时解析的。
oymdgrw73#
这称为运行时多态性。在这里将执行类i的方法。始终在运行时检查对象的引用类型。假设父类中不存在进程方法,则该方法将被重写,并将生成错误。