2013-06-24 63 views
1

据我所知,Scala中的val是一个无法替代的值。所以...为什么我可以修改这样的JFrame和JLabel,如果它们被声明为val在Scala中修改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) 
    } 

} 

回答

4

您不重新分配参考标签或框架。那是不允许的。

1

您可以更改frame所引用的对象。但是你不能改变参考本身。 试着这样做:

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

val只能阻止你分配一个新的对象变量;您仍然可以修改由val引用的对象的状态。

3

val value = new MyClass意味着你不能一个新的参考绑定到value

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

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

相关问题