• ベストアンサー

クラス変数とクラスメソッドを教えてください

みんさんどうもすみません。クラス変数とクラスメソッドなんですが、 何回本を読んでもイマイチ理解できません。クラス変数とクラスメソッド を使うことでなにがメリットなのか教えてください。例えばクラスメソッド の場合はメソッド名の前にオブジェクト名をつけなくていいとか、そういう 便利さのために使うんでしょうか?どうもまだ完全に理解できていないの で詳しい方いらっしゃったらどうか教えてください。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Snowman
  • ベストアンサー率66% (6/9)
回答No.2

 クラスメソッドのメリット、ですか。まともに解説しようとするとなかなか難しいものですね。  順番に考えてみましょう。  クラスメソッドでないメソッドといえば、インスタンスメソッドです(これは普通に使うと思いますが)。  インスタンスメソッドは、インスタンスを操作するためのメソッドです。  同じように、クラスメソッドは、クラスを操作するためのメソッドです。  要は「メソッド」とは、何かの対象を操作するものであって、その対象がインスタンスなのかクラスなのかという違いです。  おそらくこのぐらいの解説はどこにでもあると思うのですが、ピンと来ないのは、「クラスを操作する」と言われてもイメージがわかないからでしょう。  そこで、具体的な例を考えてみます。  ある銀行が、変動金利でお金を貸しているとします。金利はある基準金利+1%で決まるとします。その場合、この銀行には、   ひとつの「融資」クラスと、   複数の「融資」インスタンス  があることでしょう。この場合、「基準金利」はクラス変数であり、「基準金利を設定する」メソッドはクラスメソッドとするのが自然です。クラスメソッドで基準金利を設定すると、そのクラスのすべての融資インスタンスの金利が、その基準金利を元に再計算されることでしょう。  こういうふうに、個別のインスタンスではなく、同じクラスのすべてのインスタンスに共通に影響するようなパラメータをクラス変数とし、それを操作するメソッドをクラスメソッドにする、のがクラスメソッドの主要な用途です。  ただ、同じようなことをクラスメソッドを使わずに実装することももちろん可能です。今の例でいえば、基準金利自体をひとつのクラスとして切り出してしまい、融資インスタンスが基準金利インスタンスを参照するような設計も可能でしょう。  たとえば、「顧客のランクによって3種類の異なる基準金利を適用したい」というような場合はそうするほうがよいかもしれません。  どちらがよいかは、ま、好きなほうを使えばよいのではないでしょうか。

yamitsu
質問者

お礼

Snowmanさんアドバイスありがとうございました。特に 「個別のインスタンスではなく、同じクラスのすべてのインスタンスに共通に影響するようなパラメータをクラス変数とし、それを操作するメソッドをクラスメソッドにする、のがクラスメソッドの主要な用途です。 」 の部分がとてもわかりやすかったです。もう一度 クラス変数とクラスメソッドを勉強してみたいと思いました。 まだ完全には理解できていないとは思うんですが、少しづつ でも進歩したいと思っております。本当にありがとうござい ました。またなんかあったときはよろしくお願いします。

その他の回答 (1)

  • kuro_73
  • ベストアンサー率28% (33/117)
回答No.1

クラスメソッドというのが良く分かりませんが、それはstaticメソッドのことでしょうか・・・ 私はどんなクラスからも便利使いされるようなロジックをstaticメソッドにします。例えばtrimをするときに、NullPointerExceptionを出さないようにこんなメソッドを作ります。 public class UtilBean{ public static final String trim(String s,Object tmp){ try{ s.trim(); }catch(Exception e){ //sがnullならここに来ます return tmp; } } } これを各クラスごとにメソッドを作ったら大変です。親クラスに一つ持つことも考えられますが、全く関係ないクラスどうしで、同じ親クラスを持つことが不可能なこともあります。そこで、staticメソッドにして一つのクラス(UtilBean)にまとめてしまうのです。 どうですか?なんとなくわかっていただけましたか? static変数はカウンターとかを考えると分かりやすいですよね。 きっとだれかがまた解説してくれるでしょう。

yamitsu
質問者

お礼

kuro_73さん貴重なアドバイスありがとうございました。 確かにstaticメソッドで一つのクラスにまとめてしまう というやり方もあるんだなっていうのがわかりました。 これからなにかあったときは今回のkuro_73さんの アドバイスを思い出して使えたらなって思いました。 今回は本当にありがとうございました。

関連するQ&A

専門家に質問してみよう