据我所知,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)
}
}
答案 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
和不可变对象之间混淆。在您的代码中,JFrame
和JLabel
是完全可变的,因为它们具有改变对象内部状态的getter和setter。但是val
值意味着您无法分配另一个对象引用。