• ベストアンサー

静的メソッドとインスタンスメソッドの違い

静的メソッドとインスタンスメソッドは違うと本に書いてあったのですが。 具体的にどのように違うのか教えていただければ幸いです。

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

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

  • ベストアンサー
  • mamoony
  • ベストアンサー率50% (2/4)
回答No.1

まず、クラスとインスタンスの違いについて説明します(分かっていれば飛ばして下さい)が、たとえば、「ネコ」というのは、ネコという種類をあらわすもので、クラスに対応します。それに対し、ネコには家の「たま」もいれば、隣の家の「みけ」もいますね。これはネコというクラスに対するインスタンスになるわけです。 さて、静的メソッドというのは、言語によってはクラスメソッドと呼ばれているもので、クラスに対して呼び出すメソッドのことです。いっぽう、インスタンスメソッドは、インスタンスに対して呼び出すものです。したがって、インスタンスメソッドは、クラスのインスタンスであるオブジェクトが存在しなければ呼び出すことができませんが、静的メソッドはインスタンスが存在しなくても、クラスに対して呼び出すことができます。 たとえば、「ネコ」というクラスには、「足の数を求める」という静的メソッドが存在し、「ネコ」のインスタンスメソッドには「毛の色を求める」というメソッドがあったとします。「ネコ」というクラスに対しては、足の数を求めることができますが、毛の色を求めることはできませんね(毛の色はそれぞれのネコで異なるから)。

nezunezu
質問者

お礼

mamoony様ありがとうございました。 的確な例えで説明していただき、昨日よりは理解できたように思えます。 まだまだJAVAは始めたばかりでわからない事は多いですががんばって学ぼうとおもっています。 ありがとうございました。

その他の回答 (1)

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

わかりやすい説明をNo.1でしていただいたので、 私は具体例を示します。 public class AAA{ //インスタンス変数 String X = null; //初期化____コンストラクタってこれでいいんでしたっけ(汗) AAA(String x_){ X=x_; } //静的メソッド public static String getName(){ return "AAA"; } //インスタンスメソッド public String getX{ return x_; } } public class Test{ public static void main(String args[]){ //静的メソッドはそのまま使える System.out.println("静的メソッドを実行..."+AAA.getName()); //AAAのインスタンスを作成 AAA obj_a = new AAA("obj_aから与えた文字列"); System.out.println("インスタンスメソッドを実行..."+obj_a.getX()) } } これをTest.javaに保存してコンパイルして実行すると 実行結果は次のようになります >java Test 静的メソッドを実行...AAA インスタンスメソッドを実行...obj_aから与えた文字列

nezunezu
質問者

お礼

kuro_73様ありがとうございました。 具体例までしていただけるとは思ってなかったのでびっくりしました。 すこし具体例についてまだまだ学習不足な点がありまてすぐに理解することができませんでしたが。 腰を据えてじっくり取り組んでいこうと思ってます。 ありがとうございました。

関連するQ&A

  • Java 静的メソッドとインスタンスメソッド

    静的メソッドとインスタンスメソッドの使い分けがよくわかりません。 私の認識は 静的メソッド:インスタンスメンバ変数を参照する必要がない処理 インスタンスメソッド:インスタンスメンバ変数を参照して行う処理 と思っています。 よって、例えばDAOを作成する場合、select、update、insertを実行するメソッドを作成しますが、これらはクラスのインスタンスメンバ変数を参照する必要がないので静的メソッドにするべきだと思っています。 しかし、本やネットのDAOのサンプルプログラムはインスタンスメソッドで作成されています。 これらは、private static String の変数(SQL文が記述されている)を参照していますが、インスタンスメンバ変数は参照していません。 なぜselect、update、insertのメソッドをインスタンスメソッドにする必要があるのかわかりません。 静的メソッドとインスタンスメソッドの使い分けの基準を教えていただけないでしょうか。 よろしくお願いします。

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

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

  • メソッドについて

    インスタンスメソッドと静的メソッドとありますが、 本を読んだりしてもいまいちわかりません。 分かりやすく教えてほしいんですが・・・

    • ベストアンサー
    • Java
  • インスタンス化されているかの情報を 知るメソッド

    VisualStudioC#で Aというクラスがあり、それを B,Cというクラスでインスタンスで使用したとします。 A: { ?????? } B: { A a = new A(); } C: { A a = new A(); } Aクラスの中の処理でB,Cのどちらでインスタンス化されているのかという情報を 知るメソッドはあるのでしょうか? ちなみにインスタンス化するときにAに引数などを送り込まないこととします。

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

    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
  • インスタンスとオブジェクト

    こんばんは。 変数について教えて下さい。 プログラム自体が初めてなので 「たのしい Ruby 第3版」を読んでいます。 ずっとインスタンスとオブジェクトの違いが曖昧なままです。 その本の「クラスとモジュール」という章にて クラスを定義する構文。 インスタンス変数とローカル変数の違いですが、 以下の説明で一部理解できずにつまずいています。 ―――――――――――― @ で始まる変数は インスタンス変数 といいます。 ローカル変数はメソッドごとに異なる変数として扱われますが、 インスタンス変数は同じインスタンス内であれば、 メソッド定義を超えてその値を参照したり、変更したりできます。 なお、初期化されていないインスタンス変数を参照すると nil が得られます。 インスタンス変数は、インスタンスごとに違う値を持つことができます。 またインスタンス変数は、 インスタンスがある間は値を保持しておいて 何度でも利用することができます。 一方、ローカル変数はメソッド呼び出しごとに新しく割り当てられるため、 メソッドから抜けると値を忘れてしまいます。 ―――――――――――― ここで分からないのは、 ・ローカル変数が "メソッドごと" に異なる変数として扱われる ・インスタンス変数は同じ "インスタンス内" であれば、 メソッド定義を超えてその値を参照したり、変更したりできます の部分です。 Webで検索してますが、 プログラミング経験ありを前提で書かれているような。 他の言語も知らないので分からない、そんなページが多いです。 人に聞くからには 自分でも頑張って理解できるように考えますので、 どうか回答よろしくお願いします。

    • ベストアンサー
    • Ruby
  • メソッドの中でインスタンス化が行われているとき。

    javaを学習している者です。 下記のような記述があったのですが、これはどういった処理になるのでしょうか?インスタンス化した時に{};をくっつけているところが分かりません。 protected boolean checkAnswer(){ EachCellOpe checkOp = new EachCellOpe(){//EachCellOpeは抽象クラス //この中にいくつかのメソッドが実装される };//←この「;」は!? } よろしくお願いします。

    • ベストアンサー
    • Java
  • 「static宣言されているメンバ関数」は、「インスタンスメソッド」な

    「static宣言されているメンバ関数」は、「インスタンスメソッド」なのでしょうか? それとも、「クラスメソッド」なのでしょうか? 先日、下記内容で質問して、その時は分かったつもりだったのですが、 やっぱり分かってなかったようなので、教えてください。 ▽「クラス関数」「メンバ関数」「メソッド」の違いを教えてください。   http://okwave.jp/qa/q5858806.html 例) ▽前提 ・Aクラスのインスタンスa ・static宣言されたpublicメソッド「static_public_method」 ・static宣言されていないpublicメソッド「public_method」 ▽メンバ関数呼び出し ・$a->static_public_method() ・A::static_public_method() ・A::public_method() このとき、「$a->static_public_method()」は、インスタンス経由でアクセスすることになるので、 「インスタンスメソッド」になるのでしょうか。それとも、static(静的)宣言しているので、「クラスメソッド」になるのでしょうか? また、「A::static_public_method()」や、「A::public_method()」は、どちらになるのでしょうか? ※現在、頭の中がこんがらがっているのは、下記3点です。どれかひとつでも構わないので、分かりやすい考え方等あれば、ぜひ教えてください。 ・「static宣言したメンバ関数」は、「インスタンスメソッド」? 「クラスメソッド」? ・「スタティック」宣言してるのに、メンバ関数へ、「->(アロー演算子)」(オブジェクト経由)でアクセスできる理由 ・「A::static_public_method()」と「A::public_method()」の違い

    • ベストアンサー
    • PHP
  • staticメソッドはどう使う?

    質問させてください。 Java初心者です。 staticメソッドは、どのようなときに使用するのでしょうか。 mainはともかくとして、他の場合は全てインスタンスメソッドにしてしまえばよいと思うのですが・・・。 どなたか教えていただけると幸いです。よろしくお願いします。

    • ベストアンサー
    • Java
  • クラスメソッドのインスタンスメソッドからの呼び出し

    クラスメソッド“say”を定義しました。 クラス外からこれを呼び出すときは Hoge.say 'hello' で、同じクラス内の、インスタンスメソッド“hello”からクラスメソッド“say”を呼び出したいとき、クラス外から呼び出すのと同じように呼び出すことはできました。 class Hoge  def self.say(word)   puts word  end  def hello   Hoge.say('hello')  end end しかし、メソッド“hello”内にHogeというクラス名を直書きしたくないのですが、どんな文法を使用すればよろしいでしょうか? # Hoge#hello内での試行錯誤 self.say 'hello' => エラー say 'hello' => エラー ひょっとして、クラス名を直書きする以外手段はないのでしょうか・・?

    • ベストアンサー
    • Ruby

専門家に質問してみよう