您能分析一下这些代码吗?谢谢

时间:2019-07-11 12:45:42

标签: java binding static polymorphism

我正在学习后期绑定和静态绑定。现在我对这些代码感到困惑。

这是我的分析:

  1. hello()是非静态方法,因此我们应该使用动态绑定,即Child。
  2. 但是子类中没有hello()方法,因此请转到其父类。找到hello()并打印第一行“来自父调用calssMethod的Hello”。
  3. 由于classMethod()是静态的,因此我们应该使用c的静态绑定,也就是Child。因此输出为“ Child中的classMethod”。

所以输出应该是

  

父调用calssMethod的您好

     

Child中的classMethod

class Parent{
    public static void classMethod() {
        System.out.println("classMethod in Parent");
    }
    public void instanceMethod() {
        System.out.println("InstanceMethod in Parent");
    }

    public void hello() {
        System.out.println("Hello from parent call calssMethod");
        classMethod();
    }
}

class Child extends Parent{
    public static void classMethod() {
        System.out.println("classMethod in Child");
    }
    public void instanceMethod() {
        System.out.println("InstanceMethod in Child");
    }
}
public class AA {
    public static void main(String[] args) {
        Child c = new Child();
        c.hello();
    }
}

现在,这是问题所在。 IDE显示输出为:

  

父调用calssMethod的您好

     

父类中的classMethod

什么是正确的分析过程?

如果我将hello()方法设为静态怎么办? 谢谢!

2 个答案:

答案 0 :(得分:1)

每当我们调用子类的对象时,首先,它总是找到并执行父类。由于两个类都具有静态classMethod,因此它始终运行父类的classMethod而不是子类的。您只能通过覆盖来获得所需的答案。

即使您将hello()方法设置为静态,它也会为您提供相同的输出。

答案 1 :(得分:1)

类(静态)方法不会作为实例方法被覆盖。当您调用方法“ hello()”时,它将使用父方法。当您在此处引用类方法时,即是在“父类”中定义的方法。

除此之外,您应该将Child实例声明为“ Parent c = new Child()”。因为您不是要在子类中添加新方法,而是要更改实现,所以您不会失去对子类方法的访问权限。如果必须使用返回父对象的方法,但又返回声明的子对象的方法,则会遇到问题。

编辑:要补充一点,通常使用继承有两个原因:专业化和扩展。

对于专业化,您可以在超类中使用定义方法,而子类在实现这些方法的方式上有所不同。例如,超类动物具有猫和狗子类。 “动物”具有方法makeSound()。您可以想象两个子类将具有不同的实现。

对于扩展,您将超类用作包含所有重叠部分的基类。除此之外,子类可能具有截然不同的实现和用法。许多接口都有这种用途。