我编写了一个代码,其中每个机器对象都有一个使用静态字段“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_id
为 1
,并且 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/