【问题标题】:What happens when you say Object someObject = otherSameObject;当你说 Object someObject = otherSameObject; 会发生什么?
【发布时间】:2014-08-20 20:47:14
【问题描述】:

我正在使用 JTabbedFrame 在 Java 中制作应用程序。每个选项卡都由扩展 JFrame 的单独类创建。我想通过在窗口关闭时将对象保存到文件中来保存每个选项卡的状态,并在创建选项卡时从文件中读取它们。我知道当你序列化一个对象时,所有的实例变量都会被保存,但是构造函数会发生什么?例如,当我在构建选项卡框架的类中说:

public class Jtab{
    private ClassThatExtendsJFrame tab;

    public Jtab(ClassThatExtendsJFrame tab){  

         this.tab = tab; // what happens here? Is the constructor called?
         JTabbedPane tabs = new JTabbedPane();
         tabs.addTab("name", icon, this.tab, "tooltip");
    }

}    

所有布置 JFrame 的代码当前都在构造函数中。布局中的所有 JLabels 和元素都是我在构造函数中分配的类的属性。所以我看到可能发生两种选择:调用构造函数并重置所有变量,或者不调用构造函数并且未创建我的布局。完成我想做的事情的最佳方法是什么?

【问题讨论】:

  • 您需要知道的第一件事是每个变量都是指向内存中某个点的指针。当您将一个变量分配给另一个变量时,您实际上是将右侧变量的内存地址分配给左侧变量。意味着知道两个变量都指向内存中的相同位置以及那里包含的内容...
  • 那么,这是否意味着内存中的这些位置会自动知道它们应该在屏幕上的位置?
  • 没有。对象知道此信息(通过其存储在内存中的属性)。定位由许多与问题没有直接关系的不同因素决定...
  • 所以我需要调用其他方法来设置布局,但是 JLabels 和文本字段在保存时会有数据。
  • 是的,您需要分配一个布局管理器,它会根据容器的要求更新容器的组件。你是什​​么意思“当他们得救”?对象是一个自包含的实体,所以是的,一旦应用,这些值将由对象本身维护,并且对同一对象(或内存位置)的所有引用都将具有相同的信息,因为它是相同的数据 ...

标签: java swing serialization constructor


【解决方案1】:

您永远不能说 object = object,因为赋值表达式的左侧不能是“对象”。相反,它是某种类型的参考变量。因此,您只能做变量获取分配的对象引用。或者变量与另一个变量引用进行比较。

【讨论】:

  • 更具体地说,赋值的左侧是一个引用变量,它必须始终为空或指向适当类的某个对象的指针。
【解决方案2】:

你说的是

this.tab = tab;

它们是两个不同的参考。

this.tab 引用类的字段

tab指的是构造函数的参数。

因此,您将参数引用的引用分配给字段。

【讨论】:

    【解决方案3】:

    在构造函数中,您将一个局部字段分配给传递给构造函数的值,其中字段和局部变量具有相同的名称 -

    public Jtab(ClassThatExtendsJFrame tab){  
         this.tab = tab; // assign tab from the argument to this instance's field
    

    也可以写成

    public Jtab(ClassThatExtendsJFrame that{  
         tab = that; // <-- this.tab
    

    同样,this 是为了克服名称冲突。

    【讨论】:

      猜你喜欢
      • 2013-10-16
      • 2013-07-23
      • 2013-04-29
      • 2018-07-15
      • 2019-01-19
      • 1970-01-01
      • 2011-05-05
      相关资源
      最近更新 更多