虚拟机或编译器如何诊断Java中具有相同变量名称的两个对象?

虚拟机或编译器如何诊断Java中具有相同变量名称的两个对象?,java,object,variables,reference,Java,Object,Variables,Reference,我很难理解虚拟机或编译器是如何工作的! 考虑以下两种JButt的创建方式: JButton jb =new JButton("firstJB"); jb.addActionListener(this); Container contentPane = getContentPane(); contentPane.add(jb); jb = new JButton("secondJB"); jb.addActionListener(this);

我很难理解虚拟机或编译器是如何工作的! 考虑以下两种JButt的创建方式:

    JButton jb =new JButton("firstJB");
    jb.addActionListener(this);
    Container contentPane = getContentPane();
    contentPane.add(jb);
    jb = new JButton("secondJB");
    jb.addActionListener(this);
    contentPane.add(jb);
问题在于VM或编译器如何诊断这两个对象

它们的变量名相同,变量应该引用内存中的地址。我们有两个地址的变量


我想也许编译器可以通过ActionEvent来诊断它们,但如何诊断呢?您能帮我弄清楚机器是如何使用它们的吗?

当您将
new JButton(“firstJB”)
分配给
jb
变量时,该变量包含对第一个
JButton
对象的引用


稍后,当您将
new JButton(“secondJB”)
分配给
jb
变量时,它会保存对第二个
JButton
对象的引用。第二个赋值不会影响第一个
JButton
对象,该对象已添加到
容器
对象中(
contentPane.add(jb)
调用在
容器
对象中存储对
JButton
对象的引用),因此不会被垃圾收集。

contentPane会复制您传入的引用。因此,当您第二次分配
jb
时,第一个引用不会丢失。您没有两个变量链接到jb。您只需一个一个地覆盖另一个,用新的oneJava按值传递引用来替换原始引用!谢谢你,埃兰,但是第一个按钮指的是什么?编译器如何识别它们?编译器不考虑变量名。他在内存中有两个不同的位置来存储这两个按钮。如果您想一想程序如何使用ActionListener区分这两个按钮,那么您必须知道侦听ActionEvent的类能够比较两个引用甚至按钮的名称,这是ActionEvent的默认ActionCommand。@Tayebeh
容器
对象有一个
列表
实例变量,每次调用
contentPane.add(jb)
,由
jb
变量持有的引用都会添加到该
列表
。在代码片段的末尾,对
JButton
对象的引用由该
列表持有。谢谢大家。你真的帮了我。