Java 此继承程序在执行时给出输出“2”。怎样

Java 此继承程序在执行时给出输出“2”。怎样,java,Java,此继承程序在执行时给出输出2。如何传递?好吧,类C的实例可以传递给这三个重载方法中的任何一个,因此编译器选择其参数具有最特定类型的方法-静态void重载方法DB b-因为b是对象的子类a的一个子类,因此b比a和对象都更具体。好吧,您知道这里C类是B的子类,B是a的子类。类a也是对象类的子类。您无法看到它,因为它是在编译时确定的 : 除了没有超类的对象之外,每个类都有一个和一个 只有一个直接超类是单一继承。在没有任何 另一个显式超类,每个类都隐式地是 反对 类可以从从以下类派生的类派生: 派生自类

此继承程序在执行时给出输出2。如何传递?

好吧,类C的实例可以传递给这三个重载方法中的任何一个,因此编译器选择其参数具有最特定类型的方法-静态void重载方法DB b-因为b是对象的子类a的一个子类,因此b比a和对象都更具体。

好吧,您知道这里C类是B的子类,B是a的子类。类a也是对象类的子类。您无法看到它,因为它是在编译时确定的

:

除了没有超类的对象之外,每个类都有一个和一个 只有一个直接超类是单一继承。在没有任何 另一个显式超类,每个类都隐式地是 反对

类可以从从以下类派生的类派生: 派生自类等,并最终派生自 最顶层的类、对象。这样一个阶级据说是所有人的后裔 继承链中的类延伸回对象

那么,最接近和最适合C类的类是什么呢

是B级家长,对吧!。重载时,方法编译器将选择:

C c = new C();
overloadedMethod(c);

因为,位于类继承权顶端的对象类和类A是C的父类。

因为继承是一种is-A关系?C类的对象也是B类和A类的对象,但B更接近。你还期望什么?这种重载会导致不可预测和不可读的代码,应该避免。来自有效Java:这应该指出,对于这个声明对象o=new C;,这将有一个意想不到的结果。@ Axelh这取决于你认为什么是意外的。嗯,知道这是编译时间,这是我预期的结果。但对于新手来说总是有点奇怪,这就是为什么我说“出乎意料”和“不出乎意料”;
C c = new C();
overloadedMethod(c);
static void overloadedMethod(B b) {
    System.out.println("2");
}