Java 动态绑定与方法匹配。这些方法如何matched/binded?
Java dynamic binding vs. method matching. How are these methods matched/binded?
我对以下代码及其输出有疑问:
public class MoarTests {
public static void main(String[] args) throws Exception {
Person p = new Student();
Student s = new Student();
p.m(0); // Prints "Person method"
p.m(0.0); // Prints "Person method"
s.m(0); // Prints "Student method"
s.m(0.0); // Prints "Person method"
}
}
class Person {
public void m(double n) {
System.out.println("Person method");
}
}
class Student extends Person {
public void m(int n) {
System.out.println("Student method");
}
}
我最困惑的情况是 p.m(0)
和 s.m(0.0)
。在 p.m(0)
中,选择的方法是 m(double n)
,即使给定的参数是一个整数,而在 s.m(0.0)
中,它匹配方法到 m(double n)
,即使在 Student 中有一个方法class 可以处理给定的双重论证。
变量的类型如何改变调用哪个方法?方法是如何选择的?
A.m(0)
在 class Person
中的方法之间进行选择,因为 A
是 Person
的类型(即使实际对象的类型Student
,它被声明为 Person 类型,因此被使用)。因为 A
(Person
) 的类型对子 class 方法不可见,所以这是唯一可用的选择,即带有 double
参数的方法。
如果有一个 int 方法和一个 double 方法,JVM 会选择 int
方法。实际上,这正是您调用 B.m(0) 时发生的情况。在这种情况下,JVM 有两个方法 m(int)
和 m(double
),它选择 m(int)
.
B.m(0.0)
与 int 不匹配,因为 0.0
是 double
而不是 int
我对以下代码及其输出有疑问:
public class MoarTests {
public static void main(String[] args) throws Exception {
Person p = new Student();
Student s = new Student();
p.m(0); // Prints "Person method"
p.m(0.0); // Prints "Person method"
s.m(0); // Prints "Student method"
s.m(0.0); // Prints "Person method"
}
}
class Person {
public void m(double n) {
System.out.println("Person method");
}
}
class Student extends Person {
public void m(int n) {
System.out.println("Student method");
}
}
我最困惑的情况是 p.m(0)
和 s.m(0.0)
。在 p.m(0)
中,选择的方法是 m(double n)
,即使给定的参数是一个整数,而在 s.m(0.0)
中,它匹配方法到 m(double n)
,即使在 Student 中有一个方法class 可以处理给定的双重论证。
变量的类型如何改变调用哪个方法?方法是如何选择的?
A.m(0)
在 class Person
中的方法之间进行选择,因为 A
是 Person
的类型(即使实际对象的类型Student
,它被声明为 Person 类型,因此被使用)。因为 A
(Person
) 的类型对子 class 方法不可见,所以这是唯一可用的选择,即带有 double
参数的方法。
如果有一个 int 方法和一个 double 方法,JVM 会选择 int
方法。实际上,这正是您调用 B.m(0) 时发生的情况。在这种情况下,JVM 有两个方法 m(int)
和 m(double
),它选择 m(int)
.
B.m(0.0)
与 int 不匹配,因为 0.0
是 double
而不是 int