多态性 - 继承:不同类型的构造函数和静态 - 动态类型的对象

问题描述 投票:0回答:1
class Top {
    float f = 1.0f;
    public void m1(Top a, short i){
        System.out.println("m1 (Top, short) in class Top");
    }
    public void m1(Top a, int i){
        System.out.println("m1 (Top, int) in class Top");
    }
    public void m1(Medium a, short i){
        System.out.println("m1 (Medium, short) in class Top");
    }
}
class Medium extends Top {
    float f = 2.0f;
    public void m1(Medium a, int i){
        System.out.println("m1 (Medium, int) in class Medium");
    }
    public void m1(Medium a, short i){
        System.out.println("m1 (Medium, short) in class Medium");
    }
}
class Bottom extends Medium {
    float f = 3.0f;
    public void m1(Bottom a, int i){
        System.out.println("m1 (Bottom, int) in class Bottom");
    }
}
public class Test {
    public static void main(String[] b) {
        int i = 0;
        short s = 1;
        Top c1 = new Top();
        c1.m1(c1, i);
        c1.m1(new Bottom(),s);

        Medium c2 = new Medium();
        c2.m1(new Medium(), s);
        c2.m1(c1, s);

        c1 = c2;
        c1.m1(new Medium(), s);
        c1.m1(c1, s);

        Top c3 = new Bottom();
        c3.m1(c3, i);
        System.out.println(c2.f + "; " + c1.f + "; " + c3.f + "; " + (new Bottom()).f);
    }
}

我在这段代码中不明白的是,当我只使用“new Bottom()”作为参数时会发生什么?应该在哪个班级?当我均衡 c1 和 c2 (c1 = c2) 时会发生什么,c1 对象是否将其类更改为 Medium?

我研究了一下,发现了一些关于“静态类型”和“动态类型”的东西,但我仍然不明白这实际上是如何工作的?

当我创建像 Top c1 = new Top(); 这样的构造函数时,很明显但什么是 Top c3 = new Bottom();或者只是 new Bottom();

java oop inheritance constructor polymorphism
1个回答
0
投票

每当你说 Top c3 = new Bottom();你指的是多态性。多态性可以定义为一个对象伪装成其他东西,通常是它继承的类或它实现的接口。这里,对象“b”试图假装是 Top 类,但实际上它是 Bottom 类的实例。

如果你尝试执行c3.m1(.., ...),那么Bottom类中的方法如果被重写就会被执行。

我们总是在层次结构中从下到上开始。我们首先检查Bottom类中是否存在方法m1()。如果是这样,它将被执行。由于Bottom类将Medium类作为其直接超类,因此如果方法m1被Medium类重写,则该方法将被执行。如果没有,则执行主基类(Top)的方法。这就是谈论多态性时方法执行的基本工作方式。

© www.soinside.com 2019 - 2024. All rights reserved.