多态代码Java

多态代码Java,java,polymorphism,Java,Polymorphism,我从老师那里得到了一些涉及多态性的代码。我们被问到,如果调用一个特定的方法,输出将是什么。我真的不知道该做什么,所以我通过eclipse运行了代码,找到了这样的答案。然而,我们确实有一个测试即将到来,我不知道如果给出类似的问题,我应该怎么做(明智地思考) 代码如下: public class Harry { public void method1() { System.out.println("harry 1"); } public void metho

我从老师那里得到了一些涉及多态性的代码。我们被问到,如果调用一个特定的方法,输出将是什么。我真的不知道该做什么,所以我通过eclipse运行了代码,找到了这样的答案。然而,我们确实有一个测试即将到来,我不知道如果给出类似的问题,我应该怎么做(明智地思考)

代码如下:

public class Harry {
    public void method1() {
        System.out.println("harry 1");
    }

    public void method2() {
        method1();
        System.out.println("harry 2");
    }
}

public class Larry extends Harry {
    public void method1() {
        System.out.println("larry 1");
        super.method1();
    }
}

public class Mary extends Larry {
    public void method2() {
        System.out.println("mary 2");
    }

    public void method3() {
        super.method1();
        System.out.println("mary 3");
    }
}

public class Jerry extends Mary {
    public void method2() {
        super.method2();
        System.out.println("jerry 2");
    } 
}

Harry var1 = new Harry();
Harry var2 = new Larry();
Larry var3 = new Jerry();
Mary var4 = new Mary();
Mary var5 = new Jerry();
Object var6 = new Larry();
我知道如果调用
var2.method2()
,它将输出:

larry 1
harry 1
harry 2
但我不知道为什么。它不是只有输出吗

harry 1
harry 2
?

谢谢您的时间和解答。

var2.method2()

var2
ISA
Larry
,意味着它是
Larry
对象的一个实例(来自右侧变量声明)

按照Larry的方法调用,您将获得第一个输出

第一个调用的方法是this,它将转到
Larry
method1()
,因为上面的原因和
method1()
被覆盖

public void method2() {
    method1();
    System.out.println("harry 2");
}

你需要玩一个小游戏:你就是电脑。现在让我们假设您了解Java并理解继承和同构,您只需一步一步地进行:

Harry var2 = new Larry();

var2.method2(); // Larry doesn't have it's own method2, so go to Harry.method2

Harry.method2: call method1() // method1 was overridden by Larry, so eventhough
// you're now in Harry, yo execute Larry.method1

  Larry.method1: print "larry 1"
  Larry.method1: call super.method1 // super is Harry

  Harry.method1: print "harry 1"
  Harry.method1: return to caller // Harry.method2

Harry.method2: print "harry 2"

理解这一点最简单的方法是不要关注引用类型,而是关注它引用的内容

如果您看到以下语句:

Harry var2 = new Larry();
然后只需知道,使用该对象调用的任何方法都将首先查看引用的类类型(
Larry
)。如果在那里找不到该方法,那么它只会在对象的超类中查找,在本例中是(
Harry


如果在Harry中仍然找不到方法调用,它将继续遍历继承树进行此搜索,直到找到所需的属性或最终找到所有Java对象的父对象,即
对象
。如果找不到方法或属性,则这是一个无效的操作,编译器将在
method1()时发出抱怨和抱怨

,即使在
Harry::method2()
内部,当前实例是
Larry
,因此将调用
Larry::method1()
。多态性就是这样工作的。@songyuanyao谢谢你!