java方法重载继承和多态性
这是我遇到的一个测试练习问题,希望您能帮助我理解这些概念 让鹰成为鸟的一个亚类。假设某个类有两个重载方法void foo(Hawk) h) 和void foo(鸟b)。在调用foo(x)之后,将执行哪个版本 声明鸟x=新鹰() 这是到目前为止我掌握的代码,有人能解释一下为什么执行foo(birdb)吗java方法重载继承和多态性,java,inheritance,polymorphism,overloading,Java,Inheritance,Polymorphism,Overloading,这是我遇到的一个测试练习问题,希望您能帮助我理解这些概念 让鹰成为鸟的一个亚类。假设某个类有两个重载方法void foo(Hawk) h) 和void foo(鸟b)。在调用foo(x)之后,将执行哪个版本 声明鸟x=新鹰() 这是到目前为止我掌握的代码,有人能解释一下为什么执行foo(birdb)吗 public class MPractice { public static void main(String args[]) { Bird x = new Hawk();
public class MPractice {
public static void main(String args[]) {
Bird x = new Hawk();
Third y = new Third();
y.foo(x);
}
}
public class Third {
void foo(Hawk h) {
System.out.println("Hawk");
}
void foo(Bird b) {
System.out.println("Bird");
}
}
当Java为选择方法执行重载解析时,它使用该类型的变量而不是对象的运行时类型来选择方法。
x
的类型是Bird
,因此选择的第三种方法是foo(Bird)
这是因为这里不涉及多态性;我们不是在Bird
变量x
上调用一个可能被重写的方法,我们只是在一个不相关的类上调用一组重载方法中的一个,Third
当Java为选择方法执行重载解析时,它使用该类型的变量,而不是对象的运行时类型,选择方法。x
的类型是Bird
,因此选择的第三种方法是foo(Bird)
这是因为这里不涉及多态性;我们不是在Bird
变量x
上调用一个可能被重写的方法,我们只是在一个不相关的类上调用一组重载方法中的一个,Third
在编译时,重载方法的方法调用是根据方法参数的类型和编译时(或静态)确定的方法参数的类型
在你的例子中,Third#foo(..)
可以带一只鹰
,也可以带一只鸟
。在你的召唤中
y.foo(x);
参数x
的编译时(或静态)类型是Bird
,因为它是这样声明的,所以将调用Third#foo(Bird)
方法。在编译时,重载方法的方法调用是根据方法参数的类型和编译时(或静态)确定的方法参数的类型
在你的例子中,Third#foo(..)
可以带一只鹰
,也可以带一只鸟
。在你的召唤中
y.foo(x);
参数x
的编译时(或静态)类型是Bird
,因为它是这样声明的,所以将调用Third#foo(Bird)
方法。此处不涉及多态性。此处不涉及多态性。