class A { }
class B extends A { }
class C extends B { }
public class MainClass {
static void overloadedMethod(A a) {
System.out.println("1");
}
static void overloadedMethod(B b) {
System.out.println("2");
}
static void overloadedMethod(Object obj) {
System.out.println("3");
}
public static void main(String[] args) {
C c = new C();
overloadedMethod(c);
}
}
执行时,此继承程序会提供输出2
。怎么样?
答案 0 :(得分:1)
那么,类C
的实例可以传递给这三个overloadedMethod
方法中的任何一个,因此编译器选择其参数具有最特定类型的方法 - static void overloadedMethod(B b)
- 因为B
是A
的子类,它是Object
的子类,因此B
比A
和{{{}更具体1}}。
答案 1 :(得分:0)
嗯,您知道C
类是B
的子类,而B
是A
的子类。类A
也是Object
类的子类(您无法看到它,因为它是在编译时确定的。)
Excepting Object,没有超类,每个类都有一个和 只有一个直接超类(单继承)。在没有任何 其他显式超类,每个类都隐式地是一个子类 对象
类可以从派生自类的类派生 从类中派生出来,等等,最终派生自 最顶级的类,对象。据说这样一个阶级是所有人的后裔 继承链中的类延伸回Object。
那么,类C
的最接近且最合适的类是什么。
C c = new C();
overloadedMethod(c);
它的父类B
对吧!当您重载方法时,编译器将选择:
static void overloadedMethod(B b) {
System.out.println("2");
}
因为,班级heirarchy和班级Object
中的A
班级是C
的大父母。
答案 2 :(得分:-1)
记住A,B和C,都扩展了Object,因此该方法将由更专业的选择更少,将代码更改为:
static void overloadedMethod(C c)// passing C not Object as parameter
{
System.out.println("3");
}
或保留方法签名,但在传递参数C之前将其转换为object:
static void overloadedMethod(Object o) {
System.out.println("3");
}
public static void main(String[] args) {
Object o = new C();
overloadedMethod(o);
}