声明String类型的变量

时间:2017-09-12 12:34:00

标签: java string

class Demo
{
String title;
private int num;
}

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

3 个答案:

答案 0 :(得分:4)

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

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

所以最初,使用您的Demo,如果您创建了一个实例,并且在内存中有类似的内容:

+−−−−−−−−−−−−−−−−−−−+
|  (Demo instance)  |
+−−−−−−−−−−−−−−−−−−−+
| title: null       |
| num: 0            |
+−−−−−−−−−−−−−−−−−−−+

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

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

然后,你有这样的事情:

+−−−−−−−−−−−−−−−−−−−+
|  (Demo instance)  |
+−−−−−−−−−−−−−−−−−−−+    +−−−−−−−−−−−−−−−−−−−−−+
| title: <Ref1132>  |−−−>|      (String)       |
| num: 42           |    +−−−−−−−−−−−−−−−−−−−−−+
+−−−−−−−−−−−−−−−−−−−+    | "This is the title" |
                         +−−−−−−−−−−−−−−−−−−−−−+

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

我应该注意,String对象,特别是在Java中是特殊的,原因有两个:

  • 他们是我们拥有文字符号("this is a string")的极少数对象之一。通常你会通过new创建一个对象,但是你几乎永远不会用字符串来做。请参阅this questionthis onethis one的答案。
  • 编译器和JVM协同工作,通过对文字创建的字符串进行特殊处理(更一般地说,通过代码中的任何常量表达式)来最小化在内存中重复使用相同的字符串; {{1}是一个带有两个文字的常量表达式;编译器可以[并且确实]将它们组合成一个字符串)。 (编译器将它们放在类文件的一部分中,称为&#34;常量池,&#34;并且JVM在加载类时自动实习。)更多关于{{interning in {{ 3}}和the spec

除此之外,他们像对象一样反对对象,但这些差异会让人感到困惑。

答案 1 :(得分:2)

java中的变量是 primitives ,如females<-cervidae[cervidae$Sex=="female",] dstf <- daisy(females[,9:14], metric = "euclidean", stand = FALSE) hcaf <- hclust(dstf, method = "ave") k <- 3 clustf <- cutree(hcaf,k=k) # k clusters dendrf <- dendro_data(hcaf, type="rectangle") # convert for ggplot clust.dff <- data.frame(label=rownames(females), cluster=factor(clustf), females$Genus, females$Species) dendrf[["labels"]] <- merge(dendrf[["labels"]],clust.dff, by="label") rectf <- aggregate(x~cluster,label(dendrf),range) rectf <- data.frame(rectf$cluster,rectf$x) ymax <- mean(hcaf$height[length(hcaf$height)-((k-2):(k-1))]) fem=ggplot() + geom_segment(data=segment(dendrf), aes(x=x, y=y, xend=xend, yend=yend)) + geom_text(data=label(dendrf), aes(x, y, label= females.Genus, hjust=0, color=females.Genus), size=3) + geom_rect(data=rectf, aes(xmin=X1-.3, xmax=X2+.3, ymin=0, ymax=ymax), color="red", fill=NA)+ coord_flip() + scale_y_reverse(expand=c(0.2, 0)) + theme_dendro() + scale_color_discrete(name="Genus") + theme(legend.position="none") ,或对对象(类的实例)的引用。

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

他们都是num成员

答案 2 :(得分:2)

你的问题不明确,但我认为你的问题也与java内存模型有关。

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

希望这可以解除你的怀疑。

N.B。:不要对String的堆内存和池内存感到困惑。如果你愿意,你应该单独阅读。