【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集

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

A 回答 (6件)

静的メソッドは、クラスに属するので、クラスが存在していれば使用できます。


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

まず始めに、お勧め過去ログです。

(検索キーワードは、「インスタンスメソッド」です。)

クラスとインスタンスの違いについて→
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/inde …
    • good
    • 0

> この「保持する」情報はJavaのVMが起動している間保持され続けます。

当然その分メモリを占有し続けます。なので、できるだけ使わないほうがいいのです。

この質問の話題はは静的フィールドではなくて静的メソッドについてだったと思うのですが……。

> オブジェクト指向ではオブジェクト(実体)を生成して使うものだという暗黙の了解がある

そんな了解はありません。
そもそも、オブジェクト指向でいう「オブジェクト」と Java 言語でいう「インスタンス」は同義ではありません。
BLUEPIXY さんも触れられていますが、Java 言語で「オブジェクト」を表す方法には、「クラス」として表す方法と、「あるクラスのインスタンス」として表す方法という、主に二通りがあります。この二つはちゃんと使い分けないといけません。
java.lang.Math クラスの設計を批判する人はこの点を理解していないと思われます。何でもかんでも「インスタンス」にすればいいというものではないのです。

参考URL:http://itpro.nikkeibp.co.jp/free/NIP/NIPCOLUMN/2 …
    • good
    • 0

>インスタンスメソッドと静的メソッドとありますが、


>本を読んだりしてもいまいちわかりません。

基本は本に書いてあるとおりです。
分からないのはおそらくどういう有用性があるのか、通常どのように使い分けるのかということではないかと思います。タブン。私も1年か2年前は同じ疑問を持っていました。

基本はインスタンスメソッドしか使わないと思ってください。しかしどうしても静的に使用したいときにのみ静的メソッドを使用すると考えていいでしょう。

BLUEPIXYさんがおっしゃっているように、静的メソッドには「保持するモノを処理する」機能があり、それを使用したいときに利用します。この「保持する」情報はJavaのVMが起動している間保持され続けます。当然その分メモリを占有し続けます。なので、できるだけ使わないほうがいいのです。インスタンスは、使いたいときに生成して使わなくなったら開放されると考えていいです。

またオブジェクト指向の考え方は、クラスは型に過ぎず、インスタンスが実体であるということが根底にあります。また、型ではなく実体に情報を持たせ扱うべきという思想上の違いがあります。タブン。


sun提供のJ2SEのメソッドを眺めてみてください。ほとんどがstaticのついていないいわゆるインスタンスメソッドであるということが分かると思います。オブジェクト指向ではオブジェクト(実体)を生成して使うものだという暗黙の了解があるので、静的メソッドは嫌われます。

なぜかsun提供のクラスの中で(タブン)唯一staticだけで構成されているクラスがあります。Mathというクラスなのですが、これはしばしば批判の対象にあげられます。何故そうなっているのかの理由は分かりません。しかし「オブジェクト指向をあまり知らないC言語出身の人」によって作られたクラスじゃないの、などという憶測をもたれてしまいます。

そこはいいとして、静的メソッドを意味もなく使用していると「あ、こいつはJava知らないな」と思われてしまうので気をつけましょう。

以上テキトーな回答でした。(じしんなし)
    • good
    • 0

かなりの強引な解釈でいくと



インスタンスメソッド ・・・命令みたいなもの
静的メソッド ・・・関数みたいなもの

たぶんそれは違うという方もいると思いますが
以前にどうしても理解できない超初心者の方に
こういったらあっさりステップアップしてくれました
    • good
    • 0

インスタンスメソッドはインスタンス(実体)を生成しなければしようできません。



対して、静的メソッド(スタティックメソッド)は、クラスに属しているものであるためインスタンスを生成しなくても使用できます。

int a = Math.abs(10);

というように、インスタンスを生成しなくても利用できます。


もしこれがインスタンス変数だったら、

Math m = new Math();
int a = m.abs(10);

のようになります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報