Java 多态行为

标签 java oop polymorphism

我编写了一个代码,其中每个机器对象都有一个使用静态字段“id”自动生成的 id。我想了解JAVA中的多态性。预期的输出是 1 2 3 4,但我得到的输出是 1 2 4 6。有人能解释为什么会发生这种情况吗?

class Machine{
    static int id=1;
    private int mach_id;
    private String name;
    Machine(){
        this.mach_id = id;
        id++;
    }
    public int getId(){
        return this.mach_id;
    }

}

class Camera extends Machine {
    private int mach_id;
    Camera(){
        this.mach_id = id;
        id++;
    }

}


public class App {
    public static void main(String[] args){
        Machine mach = new Machine();
        Camera cam = new Camera();
        Machine mach1 = new Camera();
        Machine mach2 = new Camera();
        System.out.println(mach.getId());
        System.out.println(cam.getId());
        System.out.println(mach1.getId());
        System.out.println(mach2.getId());
    }
}

最佳答案

发生的情况是这样的:

Machine mach = new Machine();

直接调用Machine构造函数。 id 当前为 1。因此,它为新对象赋予 mach_id1,并且 id 递增。

Camera cam = new Camera();

直接调用Camera构造函数。

任何构造函数所做的第一件事就是调用父类(super class)的构造函数。如果您没有明确告诉它这样做,它将隐式调用父类(super class)的无参数构造函数。所以现在调用了 Machine 构造函数。

它将该对象的 mach_id 值(将其视为一个 Machine)设置为 id 的当前值,即 2。然后它递增id

现在,Camera 构造函数开始其自己的工作。它获取 id 的当前值(当前为 3),将其放入 mach_id 中,并递增 id。现在是 4

现在这是棘手的部分。 Camera 中的 mach_id 隐藏了 Machine 中的 mach_id。但是 Machine 中的方法 getID() 看不到 Camera 中定义的 mach_id。它看到 Machine 中的那个。因此,当您调用它时,它会从对父类(super class)构造函数的调用中获取值,即 2。它看不到您在 Camera 中创建的私有(private)字段,也不知道其值,这是3

然后再次构造新的 Camera 对象。您将它们放入 Machine 变量中,但这不会改变上面提到的任何事实。您调用的方法仍然来自父类(super class)方法。

关于Java 多态行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28244913/

相关文章:

java - 以标准格式打印 XML 元素

java - 基于 gradle.settings 的 Gradle sourceSets

java - 在 Java 中读取多个文件

c# - C#中的重用抽象原则

javascript - 在创建对象时,JavaScript 中调用对象成员函数的正确方法是什么?

C++:多态类模板

带有 String 构造函数的 Java BigDecimal 错误与 ROUND_HALF_UP 舍入

c++ - 类成员标识符的解析如何在 C++ 中工作

ruby-on-rails - Rails has_many 通过多态计数器缓存

C++ 多态性 : Checking data type of sub class