Java の変数は final をつけることで再代入できなくなる。
広義では、1度しか代入せず、そのその寿命が切れるまで2度と代入されてない変数を指す。 Java のプログラマは引数やローカル変数をほぼこの実質的 final として扱うようにコーディングしているとは思う。 ほとんど実質的に final として扱うので、慣例として final を書かないことが多い。 書き出すと、コード中が final キーワードだらけになってしまう。
狭義として。 final 宣言は、ラムダや内部クラス等のスコープが入り組むような制御に関係してくる。 このような部分に対象の変数を持ち込むには final 指定されている必要がある。 しかし、ロジックとして再代入されていないのならば、それは final として認めて内部に持ち込んでもいいよと判断してくれるのが、この実質的 final である。
Java にはポインタという概念が無い。変数の入れ物のアドレスという概念自体が無い。なのでそのような操作は無い。
Java では全てのモノがそのモノ自体を指すポインタで管理されていると思ってよい。変数のポインタではなく、中身のポインタ。 このため変数の値渡しとか参照渡しとかいう概念も無い。全てポインタの値渡しである。そして使う場合に常にポインタが指し示す先で解決される。
プリミティブ型に関しても、これはイミュータブルなインスタンスと捉えれば同じ考え方で理解できる。