首页 > 解决方案 > 分配给在方法中声明的类变量,没有实例化对象

问题描述

示例是具有 swap() 方法的 Card 类。实例化了两个 Card 对象。该方法通过声明第三个 Card 变量来交换它们,但不实例化第三个对象。第三个变量用作临时持有者以支持交换。我预计交换不起作用,因为 temp 变量引用第一个对象,然后为第一个对象分配第二个对象,并为第二个对象分配 temp,根据我的假设,它会获取对第一个对象的更改.

public class Tester
{
   public static void main(String[] args)
   {
      Card[] cards = new Card[2];
      cards[0] = new Card('x');
      cards[1] = new Card('y');

      System.out.println( cards[0].getVal() + "\n" + cards[1].getVal() + "\n" );

      Card.swap(cards);

      System.out.println( cards[0].getVal() + "\n" + cards[1].getVal() + "\n" );
   }
}

//Card class --------------------------------------------------------------------
class Card
{   

   private char value;


   public Card(char value)
   { 
      set(value);
   }

   public static void swap(Card[] cards){
      Card temp = cards[0];
      cards[0] = cards[1];
      cards[1] = temp;
   }


   public boolean set(char value)
   {

      this.value = value;
      return true;
   }


   public char getVal()
   {
      return value;
   }
}

输出:

xy
_


我希望cards[0] 和cards[1] 在将temp 分配给cards[1] 之前引用cards[1] 引用的内存。我希望卡 [0] 的取消引用会丢失。

实际结果是cards[0] 与cards[1] 交换。(这是一个真实的副本,还是一个引用开关?)我的理解是,由于所有 Java 变量都是引用,所以当卡片 [0] 的取消引用变为卡片 [1] 时,临时的取消引用将变为卡片 [1]。现在看起来 temp 有自己的内存,即使它没有在“新”操作中分配堆对象。我在其他地方读到了一些东西,向我暗示这就是方法变量的工作方式,但我找不到任何东西可以证实用户定义类型或任何非原始类型的方法变量是如何工作的。

标签: javaclassvariablesmethods

解决方案


Java 上下文中的引用与 C 或 C++ 中的引用不同。在 Java 中,您正在处理指针,而这些指针是按值传递的。

因此,也没有对象的自动复制(您假设),并且在交换之后仍然只有两个Card对象,与您在调用该方法之前创建的相同。

问题的答案和评论Java 是“按引用传递”还是“按值传递”?可能有助于理解这一点。


推荐阅读