class Demo
{
String title;
private int num;
}
String是一个类,所以当我们声明title时,是将对象视为对象还是仅仅作为变量?我知道这是一个非常基本的事情,但我需要帮助。提前谢谢。
答案 0 :(得分:4)
title
与num
一样,是实例变量(有时称为实例字段),因为它是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 question,this one和this one的答案。除此之外,他们像对象一样反对对象,但这些差异会让人感到困惑。
答案 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的堆内存和池内存感到困惑。如果你愿意,你应该单独阅读。