【问题标题】:Declaration of a variable of type String [duplicate]声明字符串类型的变量[重复]
【发布时间】:2018-02-20 22:10:55
【问题描述】:
class Demo
{
String title;
private int num;
}

String 是一个类,所以当我们声明标题时,它是被视为对象还是只是一个变量?我知道这是一个非常基本的事情,但我需要帮助。提前致谢。

【问题讨论】:

  • 我不知道你为什么这么问。 title其实是一个变量,但是字符串是对象。
  • Java 中只有八个原语(booleanbyteshortcharintlongfloatdouble)。其他一切都是对象。变量title 是对位于堆上的String 对象的引用。
  • 通过String title;,您声明了reference variable,它可以将reference保存到String对象或null
  • 不要试图从散落在网络上的零零碎碎的东西中学习编程。获取一本书或课程材料,然后完成它。这会容易得多。

标签: java string


【解决方案1】:

titlenum 一样,是一个实例变量(有时称为实例字段),因为它是Demo 实例的一部分(如与 静态字段类字段 相对,后者是 Demo 类本身的一部分)。

String 等对象类型声明的变量不直接包含对象,这与int 等基本类型的变量不同,例如num 变量。相反,它们包含对对象的 reference,如果它们不包含任何引用(例如,不引用任何对象),则为 null。因此,例如,在您的情况下,title 将包含null,因为您尚未为其分配任何内容。这与num 等原始类型变量不同,后者始终包含原始类型(例如,您的num 将默认为0)。

所以一开始,如果你用你的Demo 创建了一个实例,你的内存中就会有这样的东西:

+−−−−−−−−−−−−−−−−−−−−−+ | (演示实例) | +−−−−−−−−−−−−−−−−−−−−−+ |标题:空 | |数量:0 | +−−−−−−−−−−−−−−−−−−−−−+

Demo 中的构造函数或实例方法中,您可以为title 分配一个对象,也可以为num 分配一些其他值:

this.title = "This is the title";
this.num = 42;

然后,你会得到这样的东西:

+−−−−−−−−−−−−−−−−−−−−−+ | (演示实例) | +−−−−−−−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−−−−+ |标题: |−−−>| (字符串)| |数量:42 | +−−−−−−−−−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−+ | “这就是标题” | +−−−−−−−−−−−−−−−−−−−−−−−+

注意title 不直接包含字符串;该字符串存在于其他地方。 title 只是指它。 (您可以将对象引用视为一个数字,它告诉 JVM 对象在内存中的位置。这不是它的真正含义,但它在概念上很有用。)


我应该指出,String 对象在 Java 中是特殊的,原因如下:

  • 它们是我们拥有 literal 符号 ("this is a string") 的极少数对象之一。通常你通过new 创建一个对象,但你几乎从不 用字符串来创建一个对象。查看this questionthis onethis one 的答案。
  • 编译器和 JVM 协同工作,通过对由文字创建的字符串进行特殊处理(更一般地,通过代码中的任何 常量表达式"foo" + "bar" 是具有两个文字的常量表达式;编译器可以[并且确实]将它们组合成一个字符串)。 (编译器将它们放在名为“常量池”的类文件的一个部分中,JVM 会在加载类时自动interns它们。)更多关于在the specthis question's answers 中的实习。

除此之外,它们和其他对象一样都是对象,但这些差异会让人感到困惑。

【讨论】:

  • 很高兴看到这样一个问题的彻底答案,否则可能很容易被驳回。我真的很感动。
【解决方案2】:

java 中的变量要么是原语,比如int,要么是对对象(类的实例)的引用。

title 是一个变量,并且是对 String 类对象的引用。 num 是一个变量,也是一个原语。

他们都是Demo成员

【讨论】:

    【解决方案3】:

    您的问题不清楚,但我认为您的问题也与 java 内存模型有关。

    当您声明一个变量时,无论它的类型是类(例如 String)还是原始类型(例如 int),它们都只是引用变量。现在 Java MM 中存在不同类型的内存,但为简单起见,我将讨论堆栈和堆。 堆栈存储引用变量,即当您声明 String a; 时,它仅存储在堆栈中。当你给它赋值时(通过 = "abc" 或 new String("abs")),它会在堆中获取内存。

    希望这能消除您的疑虑。

    注意:不要混淆 String 的堆内存和池内存。如果需要,您应该单独阅读。

    【讨论】:

      猜你喜欢
      • 2012-03-19
      • 2017-06-10
      • 2023-03-23
      • 2014-06-03
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多