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

このQ&Aに関連する最新のQ&A

A 回答 (2件)

まず、クラスとインスタンスの違いについて説明します(分かっていれば飛ばして下さい)が、たとえば、「ネコ」というのは、ネコという種類をあらわすもので、クラスに対応します。

それに対し、ネコには家の「たま」もいれば、隣の家の「みけ」もいますね。これはネコというクラスに対するインスタンスになるわけです。

さて、静的メソッドというのは、言語によってはクラスメソッドと呼ばれているもので、クラスに対して呼び出すメソッドのことです。いっぽう、インスタンスメソッドは、インスタンスに対して呼び出すものです。したがって、インスタンスメソッドは、クラスのインスタンスであるオブジェクトが存在しなければ呼び出すことができませんが、静的メソッドはインスタンスが存在しなくても、クラスに対して呼び出すことができます。

たとえば、「ネコ」というクラスには、「足の数を求める」という静的メソッドが存在し、「ネコ」のインスタンスメソッドには「毛の色を求める」というメソッドがあったとします。「ネコ」というクラスに対しては、足の数を求めることができますが、毛の色を求めることはできませんね(毛の色はそれぞれのネコで異なるから)。
    • good
    • 2
この回答へのお礼

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

お礼日時:2001/09/05 10:18

わかりやすい説明を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から与えた文字列
    • good
    • 0
この回答へのお礼

kuro_73様ありがとうございました。

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

お礼日時:2001/09/06 10:22

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q静的メソッドとインスタンスメソッドを定義する方法

簡単な、カウンタクラスからのインスタンス作成とその利用のテストを行いました。

テストとして作成した以下の内容のファイルをブラウザ(IEやFireFox)で開くと、期待した結果は返りますが、(Windowsで処理待ちを示す)砂時計マークがいつまで経っても消えません。

どこかで永続ループでもしているのでしょうか。

どこに問題があるのか、また、こういった問題のデバッグのコツを教えて下さい。
よろしくお願いします。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<HTML>
<HEAD>
<TITLE>教えて!goo</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
<META HTTP-EQUIV="Content-Script-Type" CONTENT="javascript">

<SCRIPT TYPE="text/javascript">
function Counter(initialCount) {
this.count = initialCount;
}

Counter.prototype = {
count : 0,
increment : function() {
this.count += 1;
},
decrement : function() {
this.count -= 1;
}
}

Counter.newInstance = function(initialCount) {
return new Counter(initialCount);
}

var counter;

function testCounter() {
counter = Counter.newInstance(100);
counter.increment();
document.write(counter.count);
}

</SCRIPT>

</HEAD>

<BODY ONLOAD="testCounter()">
</BODY>
</HTML>

簡単な、カウンタクラスからのインスタンス作成とその利用のテストを行いました。

テストとして作成した以下の内容のファイルをブラウザ(IEやFireFox)で開くと、期待した結果は返りますが、(Windowsで処理待ちを示す)砂時計マークがいつまで経っても消えません。

どこかで永続ループでもしているのでしょうか。

どこに問題があるのか、また、こういった問題のデバッグのコツを教えて下さい。
よろしくお願いします。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4...続きを読む

Aベストアンサー

writeで書き込んだ後はcloseしてください。

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

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の言語仕様(?)についてお教え下さい。

参照変数の型がインスタンスのスーパークラスの型の時、クラス変数/メソッドとインスタンス変数/メソッドの見え方が納得いかずに困っています。

以下のような条件の時です。
  ・クラスが2つあり、1つはもう1つのクラスを継承しています。
    それぞれを「スーパー」「サブ」と以下で呼びます。
  ・インスタンスは"サブ"の型です。
  ・上記インスタンスへの参照変数は"スーパー"のクラスの型です。
  ・"スーパー"、"サブ"ともに【同名】の「...続きを読む

Aベストアンサー

この辺りは「なんで?」、「どうして?」とかって考え出すと、かなり難解な所ですね。私自身、SJC-Pを受験する際も「『親 new 子』はOK。」みたいな感じで機械的に覚えていましたからね。(コバリアント[共変戻り値]とかも、何となしには分かるけど、未だに使いこなすレベルまでにはなってないなあ。)

>「なぜこうなるか」について説明がある文献、サイトなどありましたらお教えください。

取り敢えずは、いつものようにお勧め過去ログ。

Javaのメモリの管理
http://oshiete1.goo.ne.jp/qa1797536.html
staticのメリット、デメリット
http://oshiete1.goo.ne.jp/qa1355755.html

ただ、文章ばかりだと何がなんだかいまいち分からないと思うので、イラスト付きのはこっち。

HOME > Java開発Tips > Technology & Programming
よくある誤解、あやふやな知識をQ&A形式で総整理!
Javaの“常識”、“非常識”
第2回 言語仕様編
http://www.itarchitect.jp/technology_and_programming/-/27052-5.html

JVM のメモリ構造
http://www.nextindex.net/java/perform/storage.html

用は、サブクラスによるオーバーライド(メソッドの再定義)っていうのは、具体的にはJVMスタックによって実現されているわけですね。

で、私の方はどうかというと、以下のサイトでも見ながら何か面白いものが作れるかなあと考えていたのでしたが、全然ダメでした。(まだまだ修行が足りないなあ・・。)

com.sun.jdi
インタフェース StackFrame
http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/jpda/jdi/com/sun/jdi/StackFrame.html

参考URL:http://www.gihyo.co.jp/books/syoseki-contents.php/4-7741-1361-1

この辺りは「なんで?」、「どうして?」とかって考え出すと、かなり難解な所ですね。私自身、SJC-Pを受験する際も「『親 new 子』はOK。」みたいな感じで機械的に覚えていましたからね。(コバリアント[共変戻り値]とかも、何となしには分かるけど、未だに使いこなすレベルまでにはなってないなあ。)

>「なぜこうなるか」について説明がある文献、サイトなどありましたらお教えください。

取り敢えずは、いつものようにお勧め過去ログ。

Javaのメモリの管理
http://oshiete1.goo.ne.jp/qa1797536.ht...続きを読む

Q問題が解けません(インスタンスメソッド)

こんにちは。
課題をやっているのですが、問題が解けません。
問題内容です。
以下のクラス図で示したRectangleクラスを作成し、実行結果と同じに
なるようにメソッドを作成する。
クラス図
Rectangle
-width:ing
-height:int
-----------
Rectangle()
Rectangle(w:int,h:int)
getArea():int
-------------
問題文
getArea()メソッドでは面積の計算をする(高さ×幅)
コンストラクタRectangle()ではwidthとheightに初期値0を設定。
main()メソッドでは標準入力より幅、高さを整数として受け取り
コンストラクタの引数とする。
実行結果
>10
>20
インスタンスr1の面積は200
>123
>45
インスタンスr2の面積は5535
--------------------------
途中経過
import java.io.*;

class Rectangle{
public static int sum=0;

private int width;
private int height;

public Rectangle(){
width=0;
height=0;
sum++;
}
public void Rectangle(int w, int h){
width=w;
height=h;
}
public void getArea(){
int num;
num=width*height;
System.out.println("r" + sum + "インスタンスの面積は" + num);
}
}

class Ex54{
public static void main(String args[]){
BufferedReader input = new BufferedReader
(new InputStreamReader(System.in));
String wid = input.readLine();
String hei = input.readLine();

Rectangle rectangle1 = new Rectangle();
rectangle1.Rectangle(wid, hei);
}
}
「現在の問題点」
UML図の通り記述できているか自信がありません。
rectangle1.Rectangle(wid, hei);というところでエラーが出てしまいます。
r1、r2を表示するときにsumを使っているのですがこのような記述でいいか自身がありません。
どなたかよろしくお願いします。

こんにちは。
課題をやっているのですが、問題が解けません。
問題内容です。
以下のクラス図で示したRectangleクラスを作成し、実行結果と同じに
なるようにメソッドを作成する。
クラス図
Rectangle
-width:ing
-height:int
-----------
Rectangle()
Rectangle(w:int,h:int)
getArea():int
-------------
問題文
getArea()メソッドでは面積の計算をする(高さ×幅)
コンストラクタRectangle()ではwidthとheightに初期値0を設定。
main()メソッドでは標準入力より幅、高さを整数として受け取り
...続きを読む

Aベストアンサー

>UML図の通り記述できているか自信がありません。

(1)
public static int sum=0;
というコードを書かれていますが、クラス図には
+sum:int
という記述ははありません。
後の質問ともつながりますが、課題を出す方としては、Rectangleクラスにこのような属性は不要だと考えられているのだと思います。私もそう思います。

(2)
Rectangle(w:int,h:int)
が違っています。
No.1の方の回答にもあるとおり、
Rectangle(w:int,h:int):void
ではなく、
Rectangle(w:int,h:int)
であることの意味を考えてみてください。


(3)
getArea():int
が違っています。
ちなみに、後の質問ともつながりますが、Javaの世界では一般的にgetXXX()という命名をするメソッドはどのような役割を持たせるものなのかが、一般的に決まっています。"setter/getter"等の言葉でググってみてください。getterならばvoidはありえません。

>rectangle1.Rectangle(wid, hei);というところでエラーが出てしまいます。

「エラーが出てしまう」という現象だけ捉えるのではなく、エラーメッセージを読んで内容を理解しましょう。なぜエラーになるのかはエラーメッセージに書いています。呼び出す方と呼び出されるほうの型はあっていますか?

Rectangle.java:33: Rectangle(int,int) (Rectangle 内) を (java.lang.String,java.lang.String) に適用できません
rectangle1.Rectangle(wid, hei);
^

>r1、r2を表示するときにsumを使っているのですがこのような記述でいいか自身がありません。

No.1の方の回答の通り、
System.out.println("インスタンスr1の面積は" …(以下略)
System.out.println("インスタンスr2の面積は" …(こっちも略)
でよいと思います。

というか、そちらの方が望ましい。
No.2の方が書かれているように、getArea()は「面積を求める」だけにすべきです。
sumの意味合いもよく分かりません(何の「合計」でしょうか?)。

>UML図の通り記述できているか自信がありません。

(1)
public static int sum=0;
というコードを書かれていますが、クラス図には
+sum:int
という記述ははありません。
後の質問ともつながりますが、課題を出す方としては、Rectangleクラスにこのような属性は不要だと考えられているのだと思います。私もそう思います。

(2)
Rectangle(w:int,h:int)
が違っています。
No.1の方の回答にもあるとおり、
Rectangle(w:int,h:int):void
ではなく、
Rectangle(w:int,h:int)
であることの意味を考えて...続きを読む

Q子インスタンスを登録するメソッドの作成

Java初心者です。
学習中に躓いてしまったので、ご教示いただければと思います。

Testという1つのクラスを作成し、
そこから複数のインスタンスを作成します。
Test test1 = new Test();
Test test2 = new Test();
Test test3 = new Test();

元のTestクラスの中に、
public void addSub(Test child)
という、引数に指定したインスタンスを子に登録するメソッドを用意します。

実際に使うときは、
test1.addSub(test2);
とすれば、test1の子にtest2が登録されるようにしたいのです。

基本的にサブクラスにするには、クラスを作る段階でextendsを用いるイメージなので、同じクラスの別インスタンスを親子関係にする、というのがよく分かりません。

このプログラムの目的は、最終的に一番親となったインスタンス(test1)の合計メソッドを呼び出して、自分の子供に登録されているインスタンス(test2,test3)全ての値を合算するということです。

質問の方法が曖昧で分かりにくいと思いますが、
指示いただければ追記いたしますので、
お時間のある方お力を貸していただければと思います。

宜しくお願いします。

Java初心者です。
学習中に躓いてしまったので、ご教示いただければと思います。

Testという1つのクラスを作成し、
そこから複数のインスタンスを作成します。
Test test1 = new Test();
Test test2 = new Test();
Test test3 = new Test();

元のTestクラスの中に、
public void addSub(Test child)
という、引数に指定したインスタンスを子に登録するメソッドを用意します。

実際に使うときは、
test1.addSub(test2);
とすれば、test1の子にtest2が登録されるようにしたいのです。

基本的に...続きを読む

Aベストアンサー

>public void addTest(Test child){
>this.child = child;
>}
>これは、test1(元インスタンス)=test2(引数のほう)にするということ>でしょうか。

test1のメンバ変数にtest2を設定しています。

>少し違っていて、
>test1.addTestでよびだしたとして、
>test1の子(サブインスタンス?)にchild(=test2など)としたいと思っ>ています。

すいません。ここ全然意味が理解できないです・・・

>そして、本来の目的は
>最後にtest1.totalという風に呼び出したときに、
>testクラスにある、
>public int total(){
>test1の子インスタンス(addTestで引数に指定した全てのインスタン>ス)のscoreを全て足す
>}
>ということをしたいと思っています。

では

public class TestMain {
public static void main(String[] args){
Test test1 = new Test(1);
Test test2 = new Test(2);
Test test3 = new Test(3);
test1.addTest(test2);
test1.addTest(test3);
System.out.println(test1.total());
}
}

class Test{
Test(int score){
this.score = score;
}
public int score;
public List<Test> childList = new ArrayList<Test>();
public void addTest(Test child){
this.childList.add(child);
}
public int total(){
int result = this.score;
for(Test child : this.childList){
result += child.score;
}
return result;
}
}
それではこういうこと?

>public void addTest(Test child){
>this.child = child;
>}
>これは、test1(元インスタンス)=test2(引数のほう)にするということ>でしょうか。

test1のメンバ変数にtest2を設定しています。

>少し違っていて、
>test1.addTestでよびだしたとして、
>test1の子(サブインスタンス?)にchild(=test2など)としたいと思っ>ています。

すいません。ここ全然意味が理解できないです・・・

>そして、本来の目的は
>最後にtest1.totalという風に呼び出したときに、
>testクラスにある、
>public int ...続きを読む

Qクラス、インスタンスメソッドについて

JAVA初心者です。
現在、先人が作ったプログラムの修正作業を行っておりますが、
以下の点に疑問があります。(因みに、先人はJAVAのスペシャリストではありません。)

あるクラスが以下の様になっております。
public class Sample {

private static Sample s = new Sample();

private Sample() {
}

/** クラスメンバに存在するインスタンス取得
* @return Sampleクラスの唯一のインスタンス
*/
public static Sample getInstance(){
return s;
}

public static void methodA(){
...
}
}

でこのmethodAを使用するには、以下の様にします。
Sample.getInstance().methodA()

これはこれで納得で、うまく動作しますが、これは
結局の所、クラスメソッドにしたかったという事ではないのかな?と
疑問に感じています。つまり、単純に
Sample.methodA
と呼び出せばうまくいきます。

ところが、たまたまAPIドキュメントを見ていた所、Calendarクラスにもやはり
getInstanceというものが存在し、現在日時を取得するのに
Calendar.getInstance().getTime()
の様に呼び出すと書いてありました。

Sampleクラス、JAVAのCalendarクラス(これに限った事では無いとは思いますが)
のこれらのgetInstanceの効用とはなんなんでしょうか?
・クラスの外でnewでインスタンスを作り出さない所
・それでいてクラスメソッドではない(?)所
この辺りについてご回答よろしくお願いします。

JAVA初心者です。
現在、先人が作ったプログラムの修正作業を行っておりますが、
以下の点に疑問があります。(因みに、先人はJAVAのスペシャリストではありません。)

あるクラスが以下の様になっております。
public class Sample {

private static Sample s = new Sample();

private Sample() {
}

/** クラスメンバに存在するインスタンス取得
* @return Sampleクラスの唯一のインスタンス
*/
public static Sample getInstance(){
return s;
}

public static void methodA(){...続きを読む

Aベストアンサー

getInstance()メソッドについてですが、
>・クラスの外でnewでインスタンスを作り出さない所
デザインパターンでいうところのSingletonという構造になっていまして、そのクラスを使用する際にインスタンスを複数生成するのを防止する役目をします。(複数のクラス間で1つのインスタンスを使うというのが本来の意味。)

>・それでいてクラスメソッドではない(?)所
publicじゃないと他のクラスから参照できませんよね。

使用する理由としては同じクラスを複数インスタンス生成し、利用するとメモリの使用量が増えていくのを抑えるというがあります。

参考URL:http://www.tech-arts.co.jp/oo/pattern.html#Singleton


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報