やってみましょう すべての機能を
メソッドに入れていきます
準備するので少しお待ちください
これが私のメソッドです
このメソッドは望ましい範囲内の整数値を探し続け
見つけたらその整数値を返します
厳密なコードは今は重要ではありませんが
もし見たければコード分配で見ることができます
そしてここでコードを呼び出します
しかし問題があります
コンパイルするとエラーメッセージが出ました
皆さんにはわけが分からないと思います
静的メソッドと非静的メソッドを見ながら
なぜコンパイルがうまくいかないのか
説明しましょう
通常はオブジェクトにメソッドを呼び出しますが
それを行いませんでした
その理由はElevatorDemoにいるので
どのElevatorDemoのメソッドも
呼び出せると思ったからです
しかしmainから呼び出しているので
ElevatorDemoのオブジェクトも
コンパイラのエラーもありません
先ほどのこの部分がこの問題の重要なポイントです
それはreadBetweenはオブジェクトに
呼び出されていないことと
呼び出すのに最適なオブジェクトがないことです
Scannerに呼び出せたらいいのですが
それはできません
オブジェクトに呼び出せないメソッドがあるという
状況に陥ったら
静的メソッドを作ります
静的メソッドはオブジェクトに
呼び出されないメソッドです
改善策は単純にElevatorDemoに戻り
ヘルパーメソッドの静的メソッドを宣言します
このようにすればうまくいきます
シンタックスエラーがなくなりました
元の問題の答えとして適切なのは
readBetweenを
ElevatorDemoに静的メソッドとして
置くことです
しかしこの場合は違います
もしこのすばらしいメソッドを
他のクラスに使いたいとしたらどうでしょう
readBetweenメソッドはある範囲から
値を読み取りたい状況で非常に役に立つようです
そこでこれを他の場所に置きたいと思います
そしてそれを置くクラスをIOHelperと呼びます
準備したクラスをお見せしましょう
これがIOHelperクラスで
これがreadBetweenメソッドです
これは静的メソッドです
IOHelperクラスで
オブジェクトを作るつもりはないからです
IOHelperクラスを
このメソッドが属する場所にしたいのです
つまりこのメソッドを呼び出す時は
クラスの名前を明示しなければなりません
IOHelperはクラスの名前
こちらはメソッドの名前です
静的メソッドはそれほど一般的ではありません
大抵の場合実際のオブジェクトには
メソッドを実行する責任があるからです
静的メソッドを使うこともあります
レッスン4のMathクラスで
静的メソッドを見ました
構文はクラスの名前、ピリオド、
メソッドの名前です
またMathクラスにはオブジェクトがありません
クラスに平方根メソッドを直接呼び出します
なぜ静的メソッドを使う必要があるのか
疑問に思うかもしれません
なぜ数字2にメソッドを呼び出せないのかとね
Javaではそうなるのです
Javaでは数字はオブジェクトではないので
オブジェクトにメソッドは呼べません
平方根は論理的かもしれませんが
これはエラーです
では静的メソッドを要約すると
クラスに属しオブジェクトに呼び出されず
一般的ではありません
静的メソッドと呼ぶことに実は理由はありません
他の大昔のプログラミング言語の遺物です
静的メソッドが特に静的というわけでもありません
静的メソッドに加え静的変数というものもあります
次で見ていきます