• ベストアンサー

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

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

  • Java
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
  • 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

  • クラス、メソッド、プロパティ、変数などの意味は?

    いろんなサイトやネットでいろいろ調べたのですが、 よく分かりませんでした。自分なりに考えたことですが、 (1)~(6)の用語の内容とコード上での色付けは正しいでしょうか? (1)クラス(緑枠) コンストラクタ、メソッド、プロパティを一括りにまとめたパッケージのこと。 つまり、functionの【{】と【}】の間にあるもの。 (2)オブジェクト(青枠) 関数。すなわち「複数の物や動作を入れる物」。 つまりfunctionで始まるものをオブジェクトと呼ぶ。 (3)コンストラクタ(= クラス名または関数名)(紫枠) 「構築子」のこと。オブジェクトを作る名前の部分。 つまりfunction直後に付ける関数名(クラス名)をコンストラクタと呼ぶ。 (4)プロパティ(赤枠) 「特徴」のこと。 つまりfunction内で指定された変数(var b)をプロパティと呼ぶ。 function a(){var b;}; (5)メソッド(水色枠) 「動作」のこと。 つまりオブジェクト(functionで始まるもの)が 変数(var b)に指定された場合はメソッドと呼ぶ。 var b = function a(){}; (6)変数(灰色枠) function外で指定された変数(var b)は、変数と呼ぶ。 function a(){}; var b;

  • クラス変数/メソッドとインスタンス変数/メソッドの見え方について

    Javaの言語仕様(?)についてお教え下さい。 参照変数の型がインスタンスのスーパークラスの型の時、クラス変数/メソッドとインスタンス変数/メソッドの見え方が納得いかずに困っています。 以下のような条件の時です。   ・クラスが2つあり、1つはもう1つのクラスを継承しています。     それぞれを「スーパー」「サブ」と以下で呼びます。   ・インスタンスは"サブ"の型です。   ・上記インスタンスへの参照変数は"スーパー"のクラスの型です。   ・"スーパー"、"サブ"ともに【同名】の「クラス」変数/メソッド、「インスタンス」変数/メソッドがあります。 この場合に、"サブ"のインスタンスを参照している"スーパー"の型の変数を介し、それらにアクセスしたらどれが見えるか?という疑問です。 実験結果では以下のようになりました。           [フィールド]  [メソッド]   [1.static ]  スーパーの   スーパーの   [2.非static]  スーパーの   サブの 納得いかないのは「2.非static」で「フィールド」が、「スーパーの」になるところです。 これも「サブの」になると思っていました。 なぜサブクラスのが見えないのでしょうか? 同名の変数なのでスーパークラスのはサブクラスので隠れされ、サブクラスのが見えると思っていたのですが。 参考書には以下のように書いてありました。   フィールドの場合、参照変数の型のものが見える。   メソッドの場合、インスタンスの型のものが見える。 私には不自然に感じられるのですが、「こういう仕様だから。」と納得するしか無いのでしょうか? 「なぜこうなるか」について説明がある文献、サイトなどありましたらお教えください。 参考までに以下が実験したサンプルコードと結果です。長くて申し訳ありません。 「サンプルコード」 public class Super { static int staticField = 10; int instanceField = 100; static void staticMethod() { System.out.println( "staticField = " + staticField ); } void instanceMethod() { System.out.println( "instanceField = " + instanceField ); } } public class Sub extends Super { static int staticField = 90; int instanceField = 900; static void staticMethod() { System.out.println( "staticField = " + staticField ); } void instanceMethod() { System.out.println( "instanceField = " + instanceField ); } } public class TestStatic { public static void main(String[] args) { // インスタンスはSub、参照変数もSub、という状態。 Sub sub = new Sub(); System.out.println( "実験1" ); System.out.println( "1.クラス変数      " + sub.staticField ); System.out.print( "2.クラスメソッド    " ); sub.staticMethod(); System.out.println( "3.インスタンス変数   " + sub.instanceField ); System.out.print( "4.インスタンスメソッド " ); sub.instanceMethod(); // インスタンスはSub、参照変数はSuper、という状態。 Super sup = new Sub(); System.out.println( "実験2" ); System.out.println( "5.クラス変数      " + sup.staticField ); System.out.print( "6.クラスメソッド    " ); sup.staticMethod(); System.out.println( "7.インスタンス変数   " + sup.instanceField ); System.out.print( "8.インスタンスメソッド " ); sup.instanceMethod(); } } 「結果」 実験1 1.クラス変数      90 2.クラスメソッド    staticField = 90 3.インスタンス変数   900 4.インスタンスメソッド instanceField = 900 実験2 5.クラス変数      10 6.クラスメソッド    staticField = 10 7.インスタンス変数   100 8.インスタンスメソッド instanceField = 900 納得が行かないのは7のところです。 以上よろしくお願いいたします。

    • ベストアンサー
    • Java
  • 変数を使ってクラス・メソッドの呼び出し

    お世話になります。 細かい所で違う動作ですが、似たような動作のクラス、もしくはメソッドを大量に用意しないといけない場合、 またそれらを同じタイミングで状況に応じて使い分けたい場合、 皆さんならどうなされてますか? C言語では呼び出すファイル名やサブルーチンを変数を使って呼び出せるので それらの名前に連番を入れて状況に応じて変数を変化させれば良かったのですが Javaでも似た様な事って出来ますか?

  • インスタンス変数とクラス変数の違い

    1つのクラスオブジェクト内のインスタンス全てで共有できる クラス変数 @@a と、 同じインスタンス内であればメソッドの定義を越えてその値を 参照したり、変更したりできるインスタンス変数 @a のスコープの違いをお手すきでしたらご指導願えませんか? あとクラス変数にはセッターやゲッター等のアクセスメソッドを 設定できるんですか? いろいろ知りたいです。

    • ベストアンサー
    • Ruby
  • メソッドの引数としてのthisの意味

    java初心者です。教えてください。 メソッドの引数としてのthisは何を表しているのですか? いろいろ調べてみてthisには以下の2つの使用法があることがわかりました。 1.インスタンス変数の名前とインスタンスメソッド内のローカル変数名がかぶったときに、メソッド内でインスタンス変数を表すときにthis.変数名とする。 2.あるクラスのコンストラクタ内で、同じクラスの別のコンストラクタを呼ぶときに使う。 しかし、引数としてのthisの意味がわかりません。 具体的には、addMouseListener(this);や、g.drawImage(img,10,10,this);のthisです。 後者の場合はオブジェクトgのインスタンスメソッドなので、thisはオブジェクトgへの参照を表しているのでしょうか?

    • ベストアンサー
    • Java
  • Finalyメソッドを2回呼べとはどういうことですか?

    ガーベージコレクション(FinalyとDispose)の疑問です。 Finalyメソッドを2回呼べとはどういうことですか? 本にはこう書いています。 Disposeメソッドを呼び出すとき、ガーベージコレクションがFinalizeメソッドを呼び出すので合計2回実行される。 クラスフィールドによって、クライアントがDisposeメソッドを2回呼び出しても何も実行しないようにする必要がある。 Finalyメソッドが定義されているオブジェクトをマネージヒープから削除するには、 最低でももう1回はガーベージコレクションを実行しなければならない。 これは、Finalyメソッドによって、現在のオブジェクトがグローバル変数に代入される可能性があるからだ。 Dispseメソッド 2回呼んだらダメ クラスフィールドで回避 ↓ Finalyメソッド 2回呼べ     ・・・対応方法不明・・・ Finalyメソッドを2回呼べとはどうしろといっているのですか?

  • 使えるメソッドはクラスで予め指定されている?

    javaを始めたばかりでまだ右も左も分からないのですが、 (オブジェクトは作成してみましたが、クラス自体は作ったことがありません。) 例えば、Aというオブジェクトを作る為に、Bというクラスを使ったとします。 この際、使用できるメソッドというのは、クラスで予め定義されているものが使えるのでしょうか? それとも、クラスとオブジェクトというのは、全く切り離されたもので、 メソッドはjavaの世界で予め用意され、どんなオブジェクトを作成する時にも全て使用出来るものなのでしょうか? 教えてください!!

    • ベストアンサー
    • Java
  • c#のToString()メソッド

    http://msdn.microsoft.com/ja-jp/library/ms173154(v=vs.90).aspx のページによると C# では、すべてのオブジェクトが ToString メソッドを継承します。このメソッドは、該当するオブジェクトの文字列形式を返します。たとえば、int 型の変数はすべて ToString メソッドを持ち、次のようにその変数の内容を文字列として返すことができます ↑と書いてあるのですが、C言語しか知らない自分にとってint型の変数が関数、メソッドを持つ、 という概念が理解できません。これはオブジェクト指向の話なのでしょうか?クラスを理解すると わかるようになりますか? どなたかよろしくお願いします。

  • クラス、オブジェクト、インスタンス、メソッドについて。

    クラス、オブジェクト、インスタンス、メソッドに ついて教えていただけないでしょうか? 今現在の自分の認識では、乗り物を例にすると、 「乗り物」という大枠がクラス。それを、たとえば 飛行機なり電車なり船なり、より具体的にした ものがインスタンス=オブジェクト。 その具体化したものの挙動、動作(走るとか飛ぶとか) がメソッド、という理解です。 ただ、これだとオブジェクトとインスタンスを 同じものとして見てしまっているので、この2つの 違いを明確に説明しろと言われると困ってしまいます。 インスタンスとオブジェクトの違いを明確にした上で うまく伝えられる方法があれば、ご教授ください。

  • どのクラスのメソッドか、をどう見極めるか。

    どのクラスのメソッドか、をどう見極めるか。 Java初心者です(教科書で学んで、実践はこれからというレベル)。 参考書やネット上の資料等に掲載されているコードを見ていますと、 import文(10文くらい)で沢山のパッケージをimportしているようなクラスを しばしば目にしますが、このようなクラス内で使われている沢山のメソッドは、 それぞれ、どこかのクラスに属しているメソッドであるかと思います。 これらのメソッドについて、その仕様を知りたいと感じた場合、 それらがそれぞれ、どのクラスに属するのかを突き止める必要があるかと思いますが、 その突き止め方について、どなたか教えて下さい。 (一般的に普及している方法で結構です。) 例えば、知りたいと感じたメソッド名をネット検索し、 そのメソッドが「Javaの組み込みクラス」のメソッドである場合には、 ネット検索でヒットするでしょうから、その検索結果を受けて、 そのヒットしたクラスと、import文の内容とを比較し、 ネット検索でヒットしたクラスが、そのメソッドの格納主であると確信できれば、 それをもとに、そのメソッドの仕様を知ることができますよね。 (自作・他作のメソッドと、名前がバッティングしているかもしれないことを考慮すると、 やや頭が痛くなる問題になりませんか?) ネット検索で辿る方法が、まず頭に浮かびましたが、 これよりも効率的な方法がもし何かありましたら、教えて下さい。 ただ、一方で、 仕様を知りたいと思っているメソッドが、 「Javaの組み込みクラス」のメソッドではなく、 自作(もしくは、他作)のメソッドであった場合、 検索してもヒットはしませんから、その場合には、 import文にある自作もしくは他作のパッケージをしらみつぶしで探していくことになるのでしょうか? 当然、そのメソッドは、同一パッケージ内にあるクラスのpublicメソッドである可能性もありますから、 同一パッケージ内のクラスの中も、しらみつぶしに探していくことになりますよね? 各メソッドがコメントで「○○クラスのメソッド」というように注意書きされてあれば、 このような苦労はないのでしょうが、ネット上のソースを見る限りでは、 そんな親切なコメントはまず期待できないように思います。 以上、まとまりのない質問ではありますが、アドバイスを宜しくお願い致します。 自分のこの疑問が見当違いの疑問でしたら、その時は、ズバリそれを指摘して下さい。

    • ベストアンサー
    • Java