
フィールドについて vol.40
今回はフィールドについて書いていこうと思う。また、少し修飾子についても触れようと思う。
1.フィールドとは
上記の画像の様にクラスとメソッドの間に変数宣言がされている。
なぜこんなところに書くのかというと以前変数の有効範囲について説明したことがあると思うが、{}でくくられている間が有効範囲である。
今回の様にメソッドの外でありクラスの{}内にくくられているのでそのクラス内なら有効に使える変数がこのフィールドというわけだ。
言語によってはそのような変数をグローバル変数と言ったりもするが、Javaではフィールドと呼んでいる。
書き方としては、クラスとメソッドの間に
[修飾子]データ型 変数名;
もしくは
[修飾子]データ型 変数名 = 値;
フィールドが普通に使えるのか試してみよう。
Fieldクラスのstrメソッドを呼び出して確認しよう。問題なく呼び出せれば、今まで使っていた変数と同じように使えるだろう。
予想通りうまくいった。普通に変数として使えることがわかる。
これだけではどのようなメリットがあるかわからない。
2.フィールドのメリット
これまでメソッドを呼び出すときはデータが真新しいものばかりであまり使いまわしができていなかったと思う。
しかしフィールドが解決してくれる。
例えば上記の様にint型のフィールドを作り、初期値を設定するメソッド、足し算や引き算をするメソッドがある。
これまでだと、mainメソッドから二つの値を渡して計算させるか、もともと決まっている数に対しての計算をさせるかで、可変性のないものばかりであったと思う。
今回はどのように違うのか見せてみよう。
どの様にしていくかというと、
defメソッドでまず初期値を決める。
次にaddで15を足す。
そしてbackで5を引き
さらにbackで30引く。
最後にまた初期値に戻すというプログラムだ。
コンソールに表示させると
0
15
10
-20
0
のようになるだろう。実際に見てみよう。
このようにフィールドで変数の引き継ぎがうまくできている。
ここで注意点もある。
3.注意点
例を出そう。一番先出した画像と同じだが、
もしくは
Stringの前に何もついていないフィールド、もしくはpublicのついているフィールドはほかのクラスからも書き換えることができてしまう。
このようにFieldクラスのフィールドをMainクラスで書き換えてしまっている。
これは意図して書き換えたからよいのだが、書き換えるべきではなったものを、書き換えてしまう可能性もなくはない。
では、どうするのか。
修飾子を変える。
4.修飾子とは
これまで使ってきたpublicなどメソッドの前やクラスの前に着けているものだ。
修飾子とも呼んでいるが、アクセス修飾子とも呼ぶ。
アクセス修飾子とは、public、protected、privateといった修飾子の総称で、クラスなど、どこからアクセス可能であるかを決定する。
この修飾子を使ってアクセスの制限をかける。
この場合はprivateを使って制限をかける。
このようにフィールドの修飾子のところをprivateにした。
そうすると
Mainクラスで変更を行おうとすると、エラーが出た。
これで他クラスからの変更を阻止できる。
また、同じクラス内でも変更できないようにできる。
5.final修飾子
以前、変数宣言のところでも紹介したfinal(定数)が使用できる。
定数は変数と違って変化しない、させることができないもののことだ。
変更しようとすると、このようにエラーになる。
これが一番の変更の宣言だ。
アクセス修飾子の場合は変更というよりも呼び出しができるできないという意味なので少し意味が変わってくる。
フィールドについてはこのようなものだ。
普通の変数とフィールドの違いは使ってみるのが一番わかりやすいので、ぜひ使ってみてほしい。
今回は以上。
では、また次回
元体育会系文系エンジニア石黒