【问题标题】:Java - How is the return of foo.charAt(i) a reference?Java - foo.charAt(i) 的返回如何作为参考?
【发布时间】:2012-02-05 03:54:00
【问题描述】:

我是 Java 新手,但了解 C++。

字符串 foo;

当我这样做时 if(foo.charAt(i) == 'a')

'a' 是如何引用的?

而敌人 foo.ChaAt('a') 如何返回引用?当我调试时它看起来就像'a'?

这些是指针吗?我是不是太醉了?

如果它们返回值,它们会是什么样子?

【问题讨论】:

  • 您需要提供更多关于您正在做什么的背景信息? foo 是什么?你剩下的代码是什么?你能指望什么?你实际上得到了什么?
  • @Ernest Friedman-Hill:当然,但他提到他是 Java 新手,所以我 +1 的答案提到了 “自动装箱” 这个词,因为这可能令人难以置信令人困惑。比如说, Character[] array = { "a".charAt(0) } 将编译良好并将 reference 放入数组中。哦,我知道(我从上个世纪开始就有我的 SCJP),我知道,它是一个由 charAt 返回的 char。但是,您不会将基元放入数组中。所以这里出现了自动装箱来迷惑新手; )

标签: java pointers pass-by-reference


【解决方案1】:

听起来您是某些错误信息的受害者。方法String.charAt() 按值返回char。它不返回任何类型的引用;不涉及指针。

【讨论】:

  • 也许...我只是想自学。我读到'=='仅用于比较事物是否是相同的对象或引用。就像 char 是 char 一样。
  • 您也可以将== 用于原始值。
  • "==" 检查变量中的实际位是否相同。在变量包含对对象的引用的情况下,您正在测试两个变量是否引用同一个对象。在其他情况下,您正在测试构成该值的位是否相同。
【解决方案2】:

虽然可能会涉及一些酒精,但我会尝试快速向您介绍 Java 的基本知识! ;)

在我们开始之前,请记住在 Java 中没有指针。现在很多人会开始对我大喊大叫,但这是一种表达方式,我已经准备好接受任何可能的 cmets!

  • Java 中有对象和原始数据类型。 byte, short, int, long, float, double, boolean, char 是唯一的原语;对象中的所有其他内容(数组也是对象)
  • Java 中的变量可以保存原始数据类型的确切值,也可以保存告诉 JVM 如何获取对象的值(请注意,我可以说是引用,但我没有,因为它更好这个)
  • Java 中的 String 是一个对象(一个特殊的对象,因为它是不可变的,并且有很多关于字符串池和实习的讨论),它由一个字符数组支持
  • foo.charAt(i) 返回给定从零开始的索引处的 char(原始数据类型)i!
  • 'a'char!就是这样...
  • == 运算符比较变量。变量可以再次具有原始类型或对象类型。在您的情况下(原语),它比较 2 个字符,如果它们具有相同的值,则返回 true 或 false。您还可以使用相同的运算符比较不同的原始类型,但由于它们的大小不同,它会变得有点复杂。您还可以将 Objects 变量(引用)与之进行比较,但请注意,在这种情况下,您将比较告诉 JVM 如何获取 Objects 的 2 个值。 (即,您只能确定这两个变量是否得到相同的确切对象,相同的对象!)

有关传递引用的更多说明(Java 中根本不存在),您可以查看 this question

如果您需要任何其他说明,请告诉我

【讨论】:

    【解决方案3】:

    假设:foo 的类型为 String

    foo.charAt(i) 的返回是如何引用的?

    这不是参考。它是原始类型:char

    检查 charAt 的 java 文档

    查看返回类型:它是char。 char 不是引用类型。

    在 Java 中,您有一个引用类型和primitive type

    【讨论】:

      【解决方案4】:

      在 Java 中,除了原始类型之外的所有东西都是引用。 String 不被视为原始类型,但 char 是。因此,您示例中的 AFAIK 'a' 不是参考。

      不过,Java 支持 自动装箱,因此如果您尝试使用 'a' 作为对象,它可能会正常工作,就好像它是一个引用一样。

      更新:一些示例可能会有所帮助:

      char a = 'a';
      char b = 'a';
      System.out.println(a == b); // true
      String c = "a";
      String d = "a";
      System.out.println(c == d); // Dunno; may be true if the compiler created a single object for c and d, otherwise it's false
      String e = new String("a");
      String f = new String("a");
      System.out.println(e == f); // false
      

      【讨论】:

      • 补充一点:原始类型和引用类型之间可能存在差异,都是按值传递的,没有例外。
      • 等待原始类型通过引用传递,以便我可以使用 == 来比较引用值?
      • 我认为您混淆了"passing by reference""reference types" 的概念。解释太长,不适合这里,但其他回答者对此事有一些很好的见解。
      【解决方案5】:

      charAt 不返回对对象的引用,它返回 char 原始类型。当您使用== 比较两个字符是否相等时,您是在比较它们的,而不是它们的引用(在Java 中,我们不讨论指针)。

      【讨论】:

      • 所以我可以将原始类型与 '==' 进行比较,但不能说是字符串?因为一个是原始的?所以'=='现在在我比较两个字符时比较值,但是我比较两个字符串'=='就像嘿,这两个不是原始的所以不行吗?
      • @CodingIsAwesome 完全正确! 'a' == 'a' 不管 'a' 来自哪里,但 "a" == "a" 当且仅当双方都引用同一个对象时。有关详细信息,请参阅我的更新答案。
      【解决方案6】:

      'a' 将不是参考。 foo.charAt(index) 将返回一个 char 原语,因此您可以安全地使用 ==。否则你将不得不使用foo.charAt(index).equals(bar)

      【讨论】:

      • 我不相信 foo.charAt(i).equals(bar) 会起作用。我想我试过了,它告诉我没有 .equals 关联到 .charAt()
      • 是的,我知道,我是说如果它是引用类型,则必须使用 .equals,但由于它是原始类型,因此您可以安全地使用 ==
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多