我的老师提供了一些涉及多态的代码。如果您调用特定方法,我们会被问到输出是什么。我真的不知道该怎么做,所以我通过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
感谢您的时间和任何答案。
答案 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
的父对象。如果找不到方法或属性,那么这是一个无效的操作,编译器会抱怨并发牢骚