• ベストアンサー

メソッドについて

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

  • Java
  • 回答数6
  • ありがとう数1

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

静的メソッドは、クラスに属するので、クラスが存在していれば使用できます。 インスタンスメソッドは、インスタンスに属するので、インスタンスが存在していない場合には使用できません。 * ある塊があって、それがオブジェクトとすると、 その塊(オブジェクト)には、値などを保持する部分と、保持している値などを処理する部分があります。 その処理する部分がメソッドです。 クラスというオブジェクトにはその保持するモノを処理するメソッド(スタティックなメソッド:静的メソッド)があり、 インスタンスというオブジェクトには、その保持するモノを処理するメソッドがあります。

その他の回答 (5)

回答No.6

まず始めに、お勧め過去ログです。(検索キーワードは、「インスタンスメソッド」です。) クラスとインスタンスの違いについて→ http://oshiete1.goo.ne.jp/kotaeru.php3?q=129748 クラスメソッドのメリット→ http://oshiete1.goo.ne.jp/kotaeru.php3?q=188680 実装例→ http://oshiete1.goo.ne.jp/kotaeru.php3?q=267563 上記の「クラスメソッドのメリット」に関する過去ログを参照すれば、暗黙の了解うんぬんについても、理解できるかと。(要は、オブジェクトを生成して使うのかどうかについては、設計によりけり、というわけですね。) あと、Mathクラスに関してですが、結局のところ、staticなメソッド(クラスメソッド)というのは、サブクラスへの継承が不可であり、かつ、オーバーライドもできない、ということですよね。メソッドの内容も基本的な数値処理を実行するものばかりですし、個人的には、staticで構成されていても全然、違和感はないんですが…。

参考URL:
http://java.sun.com/j2se/1.4/ja/docs/ja/api/index.html
  • UKY
  • ベストアンサー率50% (604/1207)
回答No.5

> この「保持する」情報はJavaのVMが起動している間保持され続けます。当然その分メモリを占有し続けます。なので、できるだけ使わないほうがいいのです。 この質問の話題はは静的フィールドではなくて静的メソッドについてだったと思うのですが……。 > オブジェクト指向ではオブジェクト(実体)を生成して使うものだという暗黙の了解がある そんな了解はありません。 そもそも、オブジェクト指向でいう「オブジェクト」と Java 言語でいう「インスタンス」は同義ではありません。 BLUEPIXY さんも触れられていますが、Java 言語で「オブジェクト」を表す方法には、「クラス」として表す方法と、「あるクラスのインスタンス」として表す方法という、主に二通りがあります。この二つはちゃんと使い分けないといけません。 java.lang.Math クラスの設計を批判する人はこの点を理解していないと思われます。何でもかんでも「インスタンス」にすればいいというものではないのです。

参考URL:
http://itpro.nikkeibp.co.jp/free/NIP/NIPCOLUMN/20021126/1/
回答No.4

>インスタンスメソッドと静的メソッドとありますが、 >本を読んだりしてもいまいちわかりません。 基本は本に書いてあるとおりです。 分からないのはおそらくどういう有用性があるのか、通常どのように使い分けるのかということではないかと思います。タブン。私も1年か2年前は同じ疑問を持っていました。 基本はインスタンスメソッドしか使わないと思ってください。しかしどうしても静的に使用したいときにのみ静的メソッドを使用すると考えていいでしょう。 BLUEPIXYさんがおっしゃっているように、静的メソッドには「保持するモノを処理する」機能があり、それを使用したいときに利用します。この「保持する」情報はJavaのVMが起動している間保持され続けます。当然その分メモリを占有し続けます。なので、できるだけ使わないほうがいいのです。インスタンスは、使いたいときに生成して使わなくなったら開放されると考えていいです。 またオブジェクト指向の考え方は、クラスは型に過ぎず、インスタンスが実体であるということが根底にあります。また、型ではなく実体に情報を持たせ扱うべきという思想上の違いがあります。タブン。 sun提供のJ2SEのメソッドを眺めてみてください。ほとんどがstaticのついていないいわゆるインスタンスメソッドであるということが分かると思います。オブジェクト指向ではオブジェクト(実体)を生成して使うものだという暗黙の了解があるので、静的メソッドは嫌われます。 なぜかsun提供のクラスの中で(タブン)唯一staticだけで構成されているクラスがあります。Mathというクラスなのですが、これはしばしば批判の対象にあげられます。何故そうなっているのかの理由は分かりません。しかし「オブジェクト指向をあまり知らないC言語出身の人」によって作られたクラスじゃないの、などという憶測をもたれてしまいます。 そこはいいとして、静的メソッドを意味もなく使用していると「あ、こいつはJava知らないな」と思われてしまうので気をつけましょう。 以上テキトーな回答でした。(じしんなし)

  • 7marine
  • ベストアンサー率36% (59/160)
回答No.2

かなりの強引な解釈でいくと インスタンスメソッド ・・・命令みたいなもの 静的メソッド ・・・関数みたいなもの たぶんそれは違うという方もいると思いますが 以前にどうしても理解できない超初心者の方に こういったらあっさりステップアップしてくれました

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.1

インスタンスメソッドはインスタンス(実体)を生成しなければしようできません。 対して、静的メソッド(スタティックメソッド)は、クラスに属しているものであるためインスタンスを生成しなくても使用できます。 int a = Math.abs(10); というように、インスタンスを生成しなくても利用できます。 もしこれがインスタンス変数だったら、 Math m = new Math(); int a = m.abs(10); のようになります。

関連するQ&A

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

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

    • ベストアンサー
    • Java
  • Java 静的メソッドとインスタンスメソッド

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

    • ベストアンサー
    • Java
  • 変数・メソッドについて

    教えていただきたいのですが Javaでは静的変数・静的メソッド、 インスタンス変数・インスタンスメソッドという分類がありますね。 これはどういう違いがあるのですか? どういう処理の時にどのメンバを作成していくんだよー! という明確な区別はあるのでしょうか? どなたかご協力よろしくお願いします。

    • ベストアンサー
    • Java
  • 静的プロパティと静的メソッドの使い方

    インスタンスメソッドやインスタンスプロパティをアロー演算子で参照する方法と 静的メソッドや静的プロパティを「::」演算子で参照する方法があるかと思います。 静的に呼び出すメリットとはどのような場合が挙げられますでしょうか?

    • ベストアンサー
    • PHP
  • staticメソッドにするかどうかの判断

    staticメソッドの使いどころについて質問させてください。 まず、メソッドの内部で、そのメソッドが定義されているクラスのイ ンスタンス変数を使用している場合は、そのメソッドはインスタンス に依存するので、インスタンスメソッドにしかできないのはわかり ます。疑問なのは、「じゃあこのメソッド内でインスタンス変数を使 わないで引数で渡せるように作れば、インスタンスに依存しないの でstaticにしていいの?」(※)ということです。 さらにこうも思います。 なんとなくですが、※のようなことをしたらオブジェクト指向の意味 がない気がします。理由ははっきりわかりません。ほんとになんとなく です。(奇跡的にあたっていたとしても、理由を教えて下さいm(_ _)m) そして、さらに混乱するのが、ユーティリティの関数などでstaticメ ソッドになっているのを見ました。この場合はどうしてメソッドの引 数を指定するようにしていて、クラスのインスタンス変数を使うこと はしないのか。 以上、大変下手な文章ですが、混乱しているポイントが伝わったでし ょうか? よろしくお願いします。

  • staticメソッドはどう使う?

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

    • ベストアンサー
    • Java
  • Javaのstaticメソッドの意味を教えて下さい

    Javaのstaticメソッドの意味を教えて下さい。 現在の解釈では、staticなメソッドとはインスタンスの生成に依存せず呼び出せる処理のことだと認識しています。逆にstaticでないメソッドは、生成後のインスタンスにしか使えない処理だと理解しています。 しかし、コンストラクタがstaticでないことに気がつき、疑問が生まれました。コンストラクタはstaticではないので、コンストラクタを呼び出す時にはそのクラスのインスタンスが必要になるはずです。しかしこのインスタンスを作るのにもコンストラクタが必要です。コンストラクタを使うためにインスタンスが必要で、インスタンスを作るためにコンストラクタが必要という無限ループになってしまいました。 そこで改めて、staticメソッドの意味を教えて頂きたいです。

  • メソッドについて教えてください。

    java 初心者2日程です(objective-c経験者) 教えていただきたいのですが、以下のように オブジェクト.メソッド というピリオドが一つの書式と クラス?.?(何を指しているのでしょうか?).メソッド? というピリオドが二つの書式が見受けられますが どういう違いで使い分けるのでしょうか? 申し訳ありません。教えていただけますか? //インスタンス化 MyObject object = new MyObject(); //メソッドの利用 object.methodA(); System.out.print(xxxxx);

    • ベストアンサー
    • Java
  • クラス変数/メソッドとインスタンス変数/メソッドの見え方について

    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
  • startメソッドについて。

    アプレット(AWT)を勉強している初心者です。 startメソッドというのはクラスの中に実装したら自動的に実行されるものなのでしょうか? あるスレッドのクラスをインスタンス化して、そのオブジェクトの中のstart()を実行することによって、スレッドが実行される、と思っているのですが、裸でstartメソッドが実装されているようなんです。 ソースは下記のサイトの3-3の落ちモノゲームです。この本を使って勉強しています。 http://www.muse.dti.ne.jp/~yoji/book/book001.html よろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう