当前位置: 首页 > 知识库问答 >
问题:

在方法中声明的类变量赋值,没有实例化对象

许胡非
2023-03-14

示例是带有 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;
   }
}

输出:

x
y

y
x

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

实际结果是卡[0]与卡[1]交换。(这是真抄,还是参考开关?)我的理解是,因为所有的Java变量都是引用,所以当cards[0]的解引用变成cards[1]时,temp的解引用就会变成cards[1]。现在看起来temp有了自己的内存,尽管在“new”操作中没有给它分配堆对象。我在其他地方读到一些东西,暗示我这就是方法变量的工作方式,但是我找不到任何东西来证实这就是用户定义类型或者任何非原始类型的方法变量的工作方式。

共有2个答案

郭彬郁
2023-03-14

Java上下文中的引用不同于C或C中的引用。在Java中,你更倾向于处理指针,而这些指针是按值传递的。

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

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

夏才
2023-03-14
  Card temp = cards[0];
  cards[0] = cards[1];
  cards[1] = temp;

“卡片X”对象的引用(由数组的0位置保存)被分配给“临时”变量。

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

然后将“卡 X”对象的引用(由“temp”变量持有)分配给数组的 1 位置。

稍后,当您取消引用数组在其 0 位置的引用时,您会按预期获得“卡 Y”。

 类似资料:
  • 主要内容:声明变量,变量赋值Java 语言是强类型(Strongly Typed)语言,强类型包含以下两方面的含义: 所有的变量必须先声明、后使用。 指定类型的变量只能接受类型与之匹配的值。 这意味着每个变量和每个表达式都有一个在编译时就确定的类型。类型限制了一个变量能被赋的值,限制了一个表达式可以产生的值,限制了在这些值上可以进行的操作,并确定了这些操作的含义。 常量和变量是 Java 程序中最基础的两个元素。常量的值是不

  • 问题内容: 我应该给班级成员这样的默认值吗? 还是这样? 在这个问题中,我发现在两种情况下 是一个定义明确的操作。 我知道第一个方法会给我一个类变量,而第二个方法则不会。但是,如果我不需要类变量,而只需要为实例变量设置默认值,那么这两种方法是否一样好?还是其中一个比另一个更“ pythonic”? 我注意到的一件事是,在Django教程中,他们使用第二种方法声明模型。我个人认为第二种方法更优雅,但

  • 我试图在java中使用Hibernate和TypedQuery。 我试图调用的方法有一个签名 我想像bellow一样调用它,但是用一个真实的实例替换null。 上面的代码经过编译,但显然带有空指针异常。 如果我对擦除的理解是正确的,那么只要我得到类对象的一个实例,这就行了,因为所有泛型类型信息在运行时都会丢失。 是否有任何方法,我可以得到一个类的实例,我可以分配给变量cls,使这个代码将工作?

  • 嘿,我正在为JMeter中的API测试做一些beanshell脚本。我已经用beanshell编写了很多jmeter脚本,它在使用方法调用时工作得很好,但是我有一个带有小数位数的值,其中SQL返回值为20.00000,而Json路径提取器得到值为20.0,因此在比较时测试失败。由于这个问题,我决定将这些值作为double变量而不是字符串进行比较,但在BeanShell上使用double.Parse

  • 本文向大家介绍c++ 类中const成员变量的赋值方法,包括了c++ 类中const成员变量的赋值方法的使用技巧和注意事项,需要的朋友参考一下 在头文件的类的定义中定义了一个const成员变量c++ 规则: 1、类定义中不能进行初始化,因为头文件中类的定义只是一个声明,并没有分配真正空间,因此变量是不存在的,因此是不能赋值的。 2、const 定义的变量是不能赋值 这可如何是好,声明中不能赋值,声

  • 本文向大家介绍Ruby类实例变量、类实例方法和类变量、类方法的区别,包括了Ruby类实例变量、类实例方法和类变量、类方法的区别的使用技巧和注意事项,需要的朋友参考一下 在Ruby中类实例变量、类实例方法和类变量、类方法的区别比较微妙,而且用法也有相当的区别。本文探讨一下他们的定义和基本的使用场景,以抛砖引玉...   一.类实例变量和类变量   类变量大家都很熟悉了,就是在类定义中用@@开头的变量