2017-04-16 120 views
1

为什么以下内容正确且无法正常工作?我想每一个对象应该有不同的名称:使用循环的具有相同名称的不同对象

LinearLayout rootView = (LinearLayout)findViewById(R.id.rootView); 


int i = 0; 
while (i<5) { 
    TextView wordView = new TextView(this); 
    wordView.setText(words.get(i)); 
    rootView.addView(wordView); 

    i++; 
} 

但是,如果我试图做没有循环:

TextView wordView = new TextView(this); 
wordView.setText(words.get(0)); 
rootView.addView(wordView); 

TextView wordView = new TextView(this); 
wordView.setText(words.get(1)); 
rootView.addView(wordView); 

这是不允许的,所以它是如何在Java工作完全 - 一个循环创建具有相同名称的不同对象?

谢谢!

+4

这是一个称为变量范围的基本概念。对象也没有名字。 – Kayaman

+0

我在第一个片段中看不到具有相同名称的两个对象。只有我吗? –

+0

***在问题的第一个片段中没有“具有相同名称的不同对象”***。我是唯一一个看到这个的人吗? –

回答

5

你需要了解的是一个局部变量即块范围,每个局部变量的作用域仅限于该块,并尝试下面的代码,它会工作:

{//1st block started 
    TextView wordView = new TextView(this); 
    wordView.setText(words.get(0)); 
    rootView.addView(wordView); 
    //1st block wordView scope ends here 
}//1st block ended 

{//2nd block started 
    TextView wordView = new TextView(this); 
    wordView.setText(words.get(1)); 
    rootView.addView(wordView); 
    //2nd block wordView scope ends here 
}//2nd block ended 

而且,来到while循环,你可以把它想成像上面那样的5块(即,每个块为每次迭代执行)。

您可以从JLS参考here局部变量的作用域是如何工作的:

每一个局部变量声明声明立即被 块包含。局部变量声明语句可以自由地与块中的其他类型的语句混合使用。


此外,在你的那句“每一个对象应该有一个不同的名字”,这应该是像“每个参考变量应该有一个不同的名称”更有意义(因为对象被分配只是一个修正并由参考变量指出)。

+0

谢谢!我理解范围的概念,并且感谢您对每个引用变量的更正应该有不同的名称, 因此,由于在这种情况下所有对象都具有相同的引用名称,因此我将无法访问特定的一个稍后?我的意思是,这个循环只是为了在屏幕上创建这些视图,并且我将无法“选择”任何特定的一个以供后续工作? – Foobarer

-1

这应该引导你,让你在阵列 得到不同的输出名称的基础,如果你正在寻找同名循环

public static void main(String[] args) { 
 
String option1 = "o1v1,o1v2,o1v3"; 
 
String option2 = "o2v1,o2v2,o2v3"; 
 
String option3 = "o3v1,o3v2,o3v3"; 
 
ArrayList<String> output = new ArrayList<String>(); 
 

 
String[] options1 = option1.split(","); 
 
String[] options2 = option2.split(","); 
 
String[] options3 = option3.split(","); 
 

 
for(int i=0; i<options1.length; i++){ 
 
    StringBuilder sb = new StringBuilder(); 
 
    sb.append(options1[i]); 
 
    sb.append(options2[i]); 
 
    sb.append(options3[i]); 
 
    output.add(sb.toString()); 
 

 

 
} 
 

 
System.out.println(output); 
 

 
}

虽然用逗号这将输出

+0

这是如何回答这个问题的?实际上,不,让我换个角度来看:这与问题甚至是遥相关?计数:10 ... 9 ... 8 ... –

+0

基本上我只是想你可以尝试一个for循环而不是while循环。不是真的有一个具体问题的好剪辑,但我认为for循环将完成这项工作 –

相关问题