Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 赋值给方法中声明的类变量,但未实例化对象_Java_Class_Variables_Methods - Fatal编程技术网

Java 赋值给方法中声明的类变量,但未实例化对象

Java 赋值给方法中声明的类变量,但未实例化对象,java,class,variables,methods,Java,Class,Variables,Methods,示例是一个带有swap()方法的Card类。实例化了两个卡片对象。该方法通过声明第三个Card变量交换它们,但不实例化第三个对象。第三个变量用作支持交换的临时保持器。我希望交换不起作用,因为temp变量引用第一个对象,然后第一个对象被分配给第二个对象,第二个对象被分配给temp,根据我的假设,temp拾取对第一个对象的更改 public class Tester { public static void main(String[] args) { Card[] cards

示例是一个带有swap()方法的Card类。实例化了两个卡片对象。该方法通过声明第三个Card变量交换它们,但不实例化第三个对象。第三个变量用作支持交换的临时保持器。我希望交换不起作用,因为temp变量引用第一个对象,然后第一个对象被分配给第二个对象,第二个对象被分配给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;
   }
}
输出:

x
y

y
x

我希望卡[0]和卡[1]在将temp分配给卡[1]之前引用卡[1]所引用的内存。我预计将丢失卡[0]的解引用

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

  Card temp = cards[0];
  cards[0] = cards[1];
  cards[1] = temp;
“card X”对象的引用(由数组的0位置保持)被分配给“temp”变量

然后将“卡片Y”对象的引用(由数组的1位置保持)分配给数组的0位置

然后将“card X”对象的引用(由“temp”变量保持)分配给阵列的1个位置


<> >当你引用数组中引用的引用时,它的0个位置就得到了“卡Y”。正如在本文中引用的,在java上下文中,引用不像C++或C++中的引用。在Java中,您处理的是指针,这些指针是按值传递的

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


该问题的答案和注释可能有助于理解这一点。

您发布的代码不是一个完整的代码。其中,
topCard
cards[]
的声明是根据Abra的评论编辑的。在
swap
方法中没有“取消引用”。您只是在分配引用。