执行时的继承程序给出输出'2'。怎么样?

时间:2017-05-29 09:25:56

标签: java

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。怎么样?

3 个答案:

答案 0 :(得分:1)

那么,类C的实例可以传递给这三个overloadedMethod方法中的任何一个,因此编译器选择其参数具有最特定类型的方法 - static void overloadedMethod(B b) - 因为BA的子类,它是Object的子类,因此BA和{{{}更具体1}}。

答案 1 :(得分:0)

嗯,您知道C类是B的子类,而BA的子类。类A也是Object类的子类(您无法看到它,因为它是在编译时确定的。)

Documentation

  

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);

    }