2013-06-24 59 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值意味着您不能分配另一個對象引用。

相關問題