Java 字符串类型变量的声明
String是一个类,所以当我们声明title时,它是作为对象处理的还是仅仅是一个变量?我知道这是一件很基本的事情,但我需要帮助。提前感谢。java中的变量要么是原语,如Java 字符串类型变量的声明,java,string,Java,String,String是一个类,所以当我们声明title时,它是作为对象处理的还是仅仅是一个变量?我知道这是一件很基本的事情,但我需要帮助。提前感谢。java中的变量要么是原语,如int,要么是对对象的引用(类的实例) title是一个变量,是对类String对象的引用。 num是一个变量,也是一个原语 他们也是Demotitle的成员,就像num一样,是一个实例变量(有时称为实例字段),因为它是Demo实例的一部分(与静态字段或类字段相反,后者是Demo类本身的一部分) 使用对象类型(如String)声
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通过对由文字(更一般地说,由代码中的任何常量表达式创建的字符串进行特殊处理;
是一个具有两个文字的常量表达式;编译器可以[并且确实]将它们组合成一个字符串,从而将相同的字符串在内存中重复的情况降至最低。(编译器将它们放在类文件的一个称为“常量池”的部分中,JVM在加载类时自动对它们进行实习。)有关在和中实习的更多信息“foo”+“bar”
除此之外,它们和其他对象一样都是对象,但这些差异可能会让人困惑。您的问题不清楚,但我认为您的问题也与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" |
+−−−−−−−−−−−−−−−−−−−−−+