【问题标题】:When initialising variables links to the other variable?初始化变量时链接到另一个变量?
【发布时间】:2018-12-29 21:11:04
【问题描述】:

我想了解什么是clone() 方法的好处,以及何时应该使用它,为什么有时当我将一个变量的值赋予另一个变量时,另一个变量链接 strong> 到第一个变量,我的意思是当您对其中一个变量进行更改时,另一个值会自动更改为您更改的该值,尽管有时它不会发生。 好的,现在我展示一些例子:-

  • Android Java 语言中的 RectF 变量初始化为另一个 RectF 变量时,会发生这种情况,(例如):-

    static RectF var1;
    
    //initialise it
    
    static void someVoid(){
        RectF var2 = var1;
        var2.set(...);
        //now when i changed var2 also the var1 changed
    } 
    
  • 但是当将 Integer 变量初始化为另一个整数变量时,它不会发生,(例如):-

    static int azhy = 1000;
    
    static void someVoid(){
        int hello = azhy;
        hello++;
        //now when i change the hello variable azhy variable stays constantly
    }
    

我在某个地方搜索过,但我没有找到结果,所以如果你能给我一些描述,我会感谢你。

【问题讨论】:

  • 为什么用 C# 标记?
  • 因为c#也是一种oop语言。
  • C++、Smalltalk 和许多其他的也是如此。由于您的问题是关于 Java 标记其他语言不合适。

标签: java c# android oop initialization


【解决方案1】:

请参阅答案here,了解有关对象和原语之间区别的一些有用背景。 int 是原始类型,而 RectF 是对象。

您可以将原始类型赋值操作 (int hello = azhy;) 视为将值从 azhy 复制到 hello,但它们并不引用同一个对象(因此修改 hello 不会修改 @987654328 @。

另一方面,RectF 是一个对象,因此调用RectF var2 = var1; 意味着var1var2 现在都引用同一个对象。因此,在 var2 上调用方法会修改 var1

注意,int 是原始类型,但 Integer(您在问题中提到的)是一个对象。

【讨论】:

    【解决方案2】:

    在您的第一个示例中,您使用的是一个对象,所以当您这样做时:

    RectF var2 = var1;
    

    您实际上是让 var2 指向计算机的同一内存,当您从一个对象更改值时,它也会将其更改为另一个,因为它是相同的内存空间,但名称不同。

    在您的第二个示例中,您使用的是原始变量,所以当您这样做时:

    int hello = azhy;
    

    您只是将值复制到计算机的新内存空间中。

    如果您想复制一个对象而不使它们相同,则必须创建该对象的一个​​新实例并且只复制值。使用this作为参考

    【讨论】:

      猜你喜欢
      • 2016-05-01
      • 2018-03-15
      • 1970-01-01
      • 2021-04-22
      • 2016-11-25
      • 2017-05-06
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      相关资源
      最近更新 更多