多态性代码Java



我从老师那里得到了一些涉及多态的代码。系统会询问如果您调用特定方法,输出将是什么。我不知道该怎么做,所以我通过 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

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

你需要玩一个小游戏:你就是电脑。现在让我们假设你了解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 对象的父对象,即Object。如果未找到方法或属性,则这是一个无效的操作,编译器将抱怨和抱怨

var2.method2()

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

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

第一个调用的方法将是这个,它进入method1()进行Larry,因为上述原因和method1()被覆盖

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

最新更新