defがよくわからない

defは関数を宣言するとき。
って思っているのだが

def a: String = "A"

みたく変数を宣言できちゃう。
厳密には変数でなく関数なのかも。

とりあえず、defとvalで比べてみる

scala> def a: String = "HOGE"
a: String

scala> var b: String = "PIYO"
b: String = PIYO

参照のしかたみたいなのが違うのかな?よくわからない。
var の場合は文字列への参照がいってるみたいだけど。
defの場合は呼ばれて、文字列への参照を返してるようにも思える。
defは定数のように後から値を変更できあいってのが大きな違いか。

で、だ。
クラスコンストラクタで

class Hoge(x: String){
  def str = x
}

みたく、メンバ変数をdefで宣言してるソースをみた。
これはvalにすると外から値をいじれるからそうしてないのか?
とこういうときはdefで宣言するのがセオリーなのかな?
よくわからん。