Android编程:为何可在for循环内使用同名变量wordView向布局添加多个TextView?
wordView变量,还能成功向布局添加十个不同的TextView控件? 我正在学习Udacity上的Google Android基础课程,看到一段代码有点困惑:在
onCreate方法里,先创建了包含"one"到"ten"的ArrayList<String>,然后通过for循环向LinearLayout里添加TextView。代码里每次循环都定义了同名的wordView变量,但却能成功添加十个不同的控件,课程没解释原因,想弄明白这是为什么。完整代码片段:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_numbers); ArrayList<String> words = new ArrayList<>(); words.add("one"); words.add("two"); // ... words.add("ten"); LinearLayout rootView = findViewById(R.id.root_view); for (int i = 0; i < words.size(); i++) { TextView wordView = new TextView(this); wordView.setText(words.get(i)); rootView.addView(wordView); } }
嗨,这个问题的核心其实是变量作用域的知识点,我来给你讲明白:
首先,
wordView是定义在for循环的代码块内部的,这意味着它的作用域只局限于当前这一次循环迭代。每次循环执行到TextView wordView = new TextView(this);时,都是在创建一个全新的局部变量——虽然名字和上一次循环的变量一样,但它们是完全独立的两个变量,指向的是内存中不同的TextView对象。其次,当你调用
rootView.addView(wordView);时,LinearLayout会把这个新创建的TextView对象的引用保存到自己的控件列表里。哪怕当前循环结束后,wordView这个局部变量因为超出作用域被销毁了,但TextView对象本身因为被LinearLayout持有引用,所以不会被垃圾回收,依然存在于布局中。
简单总结一下:每次循环都新建了一个TextView对象,用wordView这个临时名字指代它,把它交给LinearLayout保管后,这个临时名字就可以被回收复用了,但对象本身已经留在布局里。十个循环下来就有十个独立的TextView对象,自然能显示出十个不同的内容啦~
内容的提问来源于stack exchange,提问作者Pekyman

