Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.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_String - Fatal编程技术网

Java 字符串类型变量的声明

Java 字符串类型变量的声明,java,string,Java,String,String是一个类,所以当我们声明title时,它是作为对象处理的还是仅仅是一个变量?我知道这是一件很基本的事情,但我需要帮助。提前感谢。java中的变量要么是原语,如int,要么是对对象的引用(类的实例) title是一个变量,是对类String对象的引用。 num是一个变量,也是一个原语 他们也是Demotitle的成员,就像num一样,是一个实例变量(有时称为实例字段),因为它是Demo实例的一部分(与静态字段或类字段相反,后者是Demo类本身的一部分) 使用对象类型(如String)声

String是一个类,所以当我们声明title时,它是作为对象处理的还是仅仅是一个变量?我知道这是一件很基本的事情,但我需要帮助。提前感谢。

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

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


他们也是
Demo
title
的成员,就像
num
一样,是一个实例变量(有时称为实例字段),因为它是
Demo
实例的一部分(与静态字段或类字段相反,后者是
Demo
类本身的一部分)

使用对象类型(如
String
)声明的变量不直接包含对象,这与使用基本类型(如
int
)的变量(如
num
变量)不同。相反,它们包含对对象的引用,如果不包含任何引用(例如,不引用任何对象),则为
null
。例如,在您的示例中,
title
将包含
null
,因为您没有为其分配任何内容。这与诸如
num
之类的基本类型变量不同,后者总是包含一个基本类型(例如,您的
num
将默认为
0

因此,最初,使用
演示
,如果您创建了一个实例,您的内存中会有如下内容:

class Demo
{
String title;
private int num;
}
然后,你会有这样的东西:

this.title = "This is the title";
this.num = 42;
+−−−−−−−−−−−−−−−−−−−+ |(演示实例)| +−−−−−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−+ |标题:|−−−>| (字符串)| |数字:42 |+−−−−−−−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−+ | “这是标题”| +−−−−−−−−−−−−−−−−−−−−−+ 请注意,
title
不直接包含字符串;字符串存在于其他位置<代码>标题只是指它。(您可以将对象引用视为一个数字,它告诉JVM对象在内存中的位置。这不是它真正的含义,但在概念上很有用。)


我应该注意到,字符串对象在Java中是特殊的,原因如下:

  • 它们是为数不多的具有文字符号的对象之一(
    “这是一个字符串”
    )。通常通过
    new
    创建对象,但几乎从不使用字符串。请参阅和的答案
  • 编译器和JVM通过对由文字(更一般地说,由代码中的任何常量表达式创建的字符串进行特殊处理;
    “foo”+“bar”
    是一个具有两个文字的常量表达式;编译器可以[并且确实]将它们组合成一个字符串,从而将相同的字符串在内存中重复的情况降至最低。(编译器将它们放在类文件的一个称为“常量池”的部分中,JVM在加载类时自动对它们进行实习。)有关在和中实习的更多信息

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

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

当您声明变量时,无论其类型是类(例如字符串)还是基元类型(例如int),它们都只是引用变量。现在Java MM中存在不同类型的内存,但为了简单起见,我将讨论堆栈和堆。 堆栈存储引用变量,即当您声明
字符串a时它只存储在堆栈中。当您给它赋值(通过=“abc”或通过新字符串(“abs”))时,它在堆中获得内存

希望这能消除你的疑虑


注意:不要混淆字符串的堆内存和池内存。如果你愿意的话,你应该单独阅读。

我不知道你为什么问这个
title
实际上是一个变量,但字符串是对象。Java中只有八个原语(
boolean
byte
short
char
int
long
float
double
)。其他一切都是一个对象。变量
title
是对位于堆上的
String
-对象的引用
您声明了引用变量,该变量可以保存对String对象或
null
的引用。可能与此相关,请不要尝试从散布在Web上的位和位学习编程。找一本书或课程材料,并仔细阅读。这会容易得多。看到一个问题如此彻底的答案真是太棒了,否则这个问题可能很容易被驳回。我真的很感动。
this.title = "This is the title";
this.num = 42;
+−−−−−−−−−−−−−−−−−−−+ | (Demo instance) | +−−−−−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−+ | title: <Ref1132> |−−−>| (String) | | num: 42 | +−−−−−−−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−+ | "This is the title" | +−−−−−−−−−−−−−−−−−−−−−+