
No.1ベストアンサー
- 回答日時:
確かに"副作用"のない場合、staticにしたほうが呼び出す時に便利です。
数値aの絶対を求めるメソッドはstaticで
ans = Math.abs(a);
と出来るわけですが、こうできるのはabsメソッドの処理が引数の値の絶対値を求めるだけであり、このメソッド内で処理を完結できるからです。
staticにしない(できない)場合というのは
list = new ArrayList();
list.add(object);
のaddメソッドように、
オブジェクトの中身が変更される処理を持つメソッドはstaticにはできません。
このメソッド内で処理が完結するわけではなく、オブジェクトに影響を与えるからです。(←意図せずに影響を与えることを"副作用"と言ったりします)
staticに(できるが)しない場合というのは
staticメソッドはオブジェクトを生成する前から存在しているので、
(math = new Math()
として初めてmathオブジェクトがメモリ上に作られるわけですが、absメソッドは別にnew する前からメモリ上に存在しています)
必要な時だけメモリ上に展開したいメソッドの場合はstaticにしないことでしょう。
と、まぁ私は上のような基準でstaticにする、しないを判断しています。
出来るものはなるべくstaticにしていますが、呼び出しが便利だからと言う理由にくわえて、staticのメソッドですとこのメソッドを呼び出しても他に影響がないことを、メソッドを呼び出す人が確証できるので、その意味でstaticにします。
お礼が遅くなりすいません。
なるほど、staticでいいものは無理にインスタンスメソッドにしなくてもいいんですね、ありがとうございました。
No.8
- 回答日時:
私の場合、クラスメソッド(=静的メソッド,staticメソッド)が如何なるものかについては、以下の過去ログにて十二分に理解できたのですが、今回の質問者さんは「Javaをはじめてだいぶ経」っているということもあり、あえて違った観点からの回答を試みます。
(というか、他の回答者さんとか、閲覧者さんへのアドバイスでもあるんですけど。)http://oshiete1.goo.ne.jp/kotaeru.php3?q=188680
一般的に、クラスライブラリなどで分からないことがあった時には、よく「APIドキュメント」を利用したりしますよね。(各メソッドの引数の型や例外に、J2SDKのどのバージョンから対応しているのかなど・・。)ただ、こちらの方は、文法事項や概念などがあまり載っていなかったりします。そこで、「クラスメソッドって何?」とか、「何でインタフェースを使うの?」などのような疑問を解決するのにお勧めなのが「Java言語規定」です。
「Java Language Specification, version 1.0(日本語版)」
[財)日本規格協会 情報技術標準化研究センター(INSTAC)のマルチメディア/ハイパメディア調査研究委員会]
http://www.y-adagio.com/public/standards/tr_java …
「The Java Language Specification, Third Edition」
[サンの公式サイトより引用。全て英語ですが、最新バージョンです。]
http://java.sun.com/docs/books/jls/third_edition …
これによると、インスタンスメソッドとクラスメソッドの各々の特徴については、8.4.6.1や8.4.6.2などに載っていますが、要約すると以下のようになります。
インスタンスメソッド
→スーパクラス内で同じシグネチャをもつメソッドの上書き(override)が可能。
クラスメソッド
→スーパクラス内で同じシグネチャをもつメソッドの隠ぺい(hide)が可能。
インスタンスメソッドについて言えば、継承により単に親クラスのメソッドを呼び出すだけでなく、再び定義し直すことが可能ですし、クラスメソッドに関しては、どんな時でも同じ振舞いを保証しますよね。(java.lang.Math.absメソッドは、どのプログラマーがどんな記述をしようとも、実引数の絶対値を返しますね。)8.4.8.5では、「隠ぺいされたクラスメソッドの呼出し」に関するJavaプログラムも載っていますので、そちらの方も参考にされたら、と思います。
それ以外にも、13.4.18では、「バイナリの互換性」についての記述があります。今まで、クラスメソッドだったものをインスタンスメソッドに変更したりとか、はたまたその逆を行ったりすると、リンク時にIncompatibleClassChangeErrorとなってしまうとのことです。これなんかは、よくServletやJSPなどでソースプログラムの更新がうまく反映されない時などに、仕方なく一端、classファイルを全部削除後に再度、全コンパイルをしたらうまく表示される、といったことがあったりしますが、広い意味での「バイナリの互換性」に起因するものではないか、と思われます。
最後に、メモリとJVMとの関連性についてですが、こちらも実際には以下のようなサイトがあります。
「Java仮想計算機仕様書(The Java Virtual Machine Specification)」
http://java.sun.com/docs/books/vmspec/2nd-editio …
ただ、全部英語ということもあって、もう少し噛み砕いたのがいいんだけど・・・、という方々がいらっしゃるかもしれませんので、一応以下のサイトも載せておきます。
浅煎り珈琲 Java アプリケーション入門
パフォーマンス
4.JVM のメモリ構造
http://msugai.fc2web.com/java/perform/storage.html
No.7
- 回答日時:
No.4 のかたの疑問に関して私なりの解釈ですが、たした次のようになっていたはずです。
static 変数はプログラム開始から存在するわけではありません。またstatic メソッドを含むクラスファイルも最初からJVMに読み込まれたりしません。
プログラムの実行中に、static メソッド(または変数)が最初に呼び出された時点でそのクラスファイルがメモリにロードされ、そのクラスのすべてのstatic変数がメモリに割り当てられます。
反対に寿命のほうはあまり自信がないのですが、static変数はいつまた利用されるかわからないため、JVMは「このstatic変数はもう使われない」と判断することが不可能であり、プログラム終了までメモリを占有したままになったような・・・。

No.6
- 回答日時:
#2>基本的にメソッドはインスタンスの状態を変えるものか、あるいはインスタンスの状態によって振る舞いを変えるものだと思う
kztkさんの意見に賛成。awtやswingやファイル入出力などは、インスタンス無しには何も出来ないです。
デザインパターンの本を持ってますが、staticが付いてるのは、main()とSingleton実装のためのメソッドだけで、他のパターンクラスでは、みなインスタンスメソッドだけでした。
また、これらのインスタンスメソッドはstaticにしたら、バグになるかエラーになるか、デザインパターンとして破綻するかだと思われます。(趣味のプログラマーが偉そうなこというのもなんですが、そう思いました)
私がほとんどのメソッドをstaticにしない理由:staticには出来ないから。
どーしても、staticである必要がある時のみ、staticにする。
No.5
- 回答日時:
staticにしたほうがよいとか、そういうメソッドが多いということは、設計的に構造化プログラミングになってると思われます。
Javaはオブジェクト指向プログラミングなので、そういった場合は設計が悪いのではないかという疑いがでてきます。
No.4
- 回答日時:
はじめまして。
質問とはちょっとずれているかもしれませんが、私は以下のような疑問をもち、いろいろと調べていたところです。
staticメソッドは実行開始(あるいは最初の使用)から実行終了まで
メモリ展開されている状態であるというのは本当なのか?
上記が本当となればstaticメソッドはむやみに使うのはメモリの無駄使いと
言われてしまうと思うです。というわけで、調べた結果なんですが、
自信はありませんが、どうもウソなんじゃないかと思っています。
参考にさせていただいたのは下記のURLです。
参考URLの内容を要約する能力はないのでぜひ読んでください。
staticメソッドがメモリに存在し続けるというのは
static変数がプログラムの実行開始から終了までメモリに存在し続ける
ことからの類推がもたらす勘違いなのではないかと思います。
素朴に考えてみてもstaticメソッドはIntegerやMathから自作のstaticメソッドまで
大量にあると思うのですが、これらのメソッド(関数)が本当に最初から
すべてメモリ展開され、その後、捨てられることなくプログラムの終了まで
メモリに存在し続けるというのはあまりに非効率で、Java(あるいはVM?)の
設計者がそんなことしているとは思えません。
以上、書いてはみたものの、実は私は経験のかなり浅いものでして
ぜひこのようなことに詳しい方にコメントをいただければと思います。
参考URL:http://question.woman.excite.co.jp/kotaeru.php3? …
No.3
- 回答日時:
「インスタンスメソッドにしなければならない理由」
がないときはstatic。
---
>staticにしない理由は何なのでしょうか
プログラマが「その必要性を感じた時に」インスタンスメソッドにする。
「必要性を感じない」なら、
試しにそれをstaticにしてみるとよい。

No.2
- 回答日時:
私は始めて覚えた言語がJavaですが、
>staticにした方が呼び出すときに便利
という感覚はあまり分かりません。
基本的にメソッドはインスタンスの状態を変えるものか、あるいはインスタンスの状態によって振る舞いを変えるものだと思うので、私がstaticにするのは
・ユーティリティ系の関数
・インスタンスを作成したり返したりするメソッド
(getInstance()やcreateXX()など)
くらいです。前者などはむしろ逆に"クラス名."をつけなければならないのが鬱陶しいと感じるほどです。
他にどういうときにstaticになるか考えて見たのですが、#1さんのあげたArrayListで、addをstaticにしてArrayList.add(list, object)のように設計していたら、staticばっかりになっていたでしょうね。
質問者さんがどういう使われ方をして便利だと感じられているのかに興味があります。
この回答への補足
ご回答ありがとうございます。呼び出すときに便利、と言うのは、例えばオブジェクトを格納する変数の名前を何にすべきか考えなくていいのが楽です。仮に考えずにとりあえずobjとかにしてしまうと、もし将来何かほかの呼び出しを追加して拡張したときはobj2, obj3…と増えていくとまずいなぁとか。またこのオブジェクトが大量に作られることはなかろうかとか、Singletonにした方がいいんだろうかとか、何かと気になります。
あとできればstaticにして、staticが無理なときはインスタンスメソッドにするというのも、設計しだいである程度無理やりstaticにすることが出来る気がします。そうすると、インスタンスを生成する機会はけっこう少ないように思います。まぁ私はまだそんなに設計になれてるわけではないので、それは設計が悪いと言われればそれまでですが…。
また、クラス名をつける作業ですが、いつもeclipseでやってるので、私はあんまり苦になりません。それより適切な変数名をいちいち考えるほうが面倒です。
あんまりstaticを増やしすぎると(getInstance()とかは除き)だんだんオブジェクト指向から離れていくような気がしますが、どうでしょう?やっぱり設計の問題でしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- その他(プログラミング・Web制作) Pythonで複数のメソッドをまとめて管理する方法について 1 2023/03/30 00:01
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- アルバイト・パート 自宅で出来る安心安全なアルバイトについて 5 2022/11/17 10:22
- Java eclipse実行ができない 2 2022/07/27 04:47
- その他(妊娠・出産・子育て) 友人が私の子供を名前で呼ばないことについて 3 2023/05/17 17:17
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列のメソッド
-
エクセルVBAで、条件に一致する...
-
final修飾子を使っているのに、...
-
mainメソッドのthrows節で設定...
-
Labelコントロールに数字を代入...
-
ListViewにて行追加
-
CALLされていないメソッドを見...
-
コマンドプロンプト実行後に画...
-
FEM解析の読み方は?
-
c#でVBのcall的役割を果たすコ...
-
javascriptからjavaを呼び出したい
-
vbaエクセルマクロ RemoveDupli...
-
エクセルのマクロでプリンタを...
-
処理内容がほぼ同じメソッドの...
-
boolean型のフィールドとゲッタ...
-
Strutsで「setterメソッドが見...
-
Refreshメソッドの使い方
-
DBを扱う上でのclose()メソッド...
-
Range クラスのAutoFitプロパテ...
-
VB.NET2017 の IntelliSense に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
【sendkeysメソッドが動かずに...
-
mainメソッドのthrows節で設定...
-
VBA コピーが出来ません…!
-
DataGridViewでセルクリックイ...
-
コマンドプロンプト実行後に画...
-
0歳児の指しゃぶりに関して
-
エクセルVBAにおけるON TIMEメ...
-
javascriptからjavaを呼び出したい
-
配列のメソッド
-
CALLされていないメソッドを見...
-
final修飾子を使っているのに、...
-
Labelコントロールに数字を代入...
-
VBPをダブルクリックするとたま...
-
ウィンドウを最前面にできません
-
処理内容がほぼ同じメソッドの...
-
Application.Wait の参照設定
-
C#.net Define文
-
C# 演算 最大値 最小値 表現の仕方
-
Excel VBA でExcelを終了したい...
おすすめ情報