修改Scala中的val。为什么我能这样做?

时间:2013-06-24 18:22:18

标签: scala variables

据我所知,Scala中的val是一个不可改变的值。那么......为什么我可以修改JFrame和JLabel,如果它们被声明为val

package view

import javax.swing.JFrame
import javax.swing.JLabel
import java.awt.BorderLayout

object Hello {

  def main(args: Array[String]) {
    println(hello)
    val frame = new JFrame
    val label = new JLabel()

    // here I am modifying val's!
    label setText ("hello")

    frame setSize (500, 500)
    frame getContentPane () setLayout (new BorderLayout)
    frame add (label, BorderLayout CENTER)
    frame setVisible (true)
    frame setDefaultCloseOperation (JFrame EXIT_ON_CLOSE)
  }

}

5 个答案:

答案 0 :(得分:4)

您没有重新分配对标签或框架的引用。这是不允许的。

答案 1 :(得分:3)

val value = new MyClass表示您无法将新引用绑定到value

value = new MyClass // is illegal
value.changeObjectState  // is legal 

答案 2 :(得分:1)

您可以更改引用的对象frame。但是你无法改变引用本身。 尝试这样做:

val frame = new JFrame()
frame = new JFrame()

答案 3 :(得分:1)

val仅阻止您为变量分配新对象;您仍然可以修改val引用的对象的状态。

答案 4 :(得分:1)

你在常量值 - val和不可变对象之间混淆。在您的代码中,JFrameJLabel是完全可变的,因为它们具有改变对象内部状态的getter和setter。但是val值意味着您无法分配另一个对象引用。