多态性代码Java

时间:2016-02-07 03:31:53

标签: java polymorphism

我的老师提供了一些涉及多态的代码。如果您调用特定方法,我们会被问到输出是什么。我真的不知道该怎么做,所以我通过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

感谢您的时间和任何答案。

3 个答案:

答案 0 :(得分:0)

var2.method2()

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

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

第一个被调用的方法就是这个,它会转到method1()的{​​{1}},因为上面的原因和Larry被覆盖了

method1()

答案 1 :(得分:0)

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

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"

答案 2 :(得分:0)

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

如果您看到如下声明:

Harry var2 = new Larry();

然后只知道使用该对象调用的任何方法将首先查看引用的类类型(Larry)。如果在那里找不到该方法,那么它只会在对象的超类中查找,在这种情况下它将是(Harry)。

如果仍未在Harry中找到方法调用,它将继续遍历执行此搜索的继承树,直到它找到所需的属性或最终到达所有Java对象Object的父对象。如果找不到方法或属性,那么这是一个无效的操作,编译器会抱怨并发牢骚