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

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

A 回答 (2件)

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

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

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

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

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クラスを作るとメソッドの数が多くなりすぎる

クラスを作ると,たいがい,メソッドの数が多くなりすぎて,メソッドをさがすのに一苦労します.

なにか,クラスのメソッドの設計でいい方法はないでしょうか?

メソッドが増えすぎる原因として,

・フィールド変数1つにつき,取得メソッド,設定メソッドで(最大)2つ必要.

ということがあります.
あと,

・private のメソッド(クラス内部でよく使われる手続きをまとめたもの)が結構必要.
・private のメソッドから呼び出す private のメソッドが結構必要.

ということがありますが,publicメソッドがこれらのメソッドと紛れてしまう,ということがあります.

Aベストアンサー

>> 4.privateメソッドの一番外側のメソッドをprotectedにしてそれ
>> を内部クラスかスーパークラス化し、コーディングが頻繁に発生
>> する部分のメンテナンス性を向上させる。
>私の基本的知識不足で完全に理解しきれないのですが,
>非常に役に立ちそうなテクニックのような予感がします.

たとえば doSomething() というpublicメソッドが、doMiddle()というprivateメソッドを呼んでいて、なおかつさらにdoBase()というprivateメソッドが呼ばれているとします。もちろんdoBase()の下にいくつも下位メソッドがあっても構いません。

最初はdoSomething()だけでよかったのが、仕様変更の積み重ねでdoAdd1() doAdd2()と増えていき、そのたびにdoMiddle()に変更が頻繁に発生するがdoBase()は特に変わらないという場合に、メンテしたいのはdoMiddle()だけなので、doBase()はそのクラスの中に実装されている必要はないので、doBase()をprotectedメソッドとした配下ロジックを継承元クラスとして、クラス分けすることができます。

実際にはこんな簡単なケースではないのですが、だいたいぐちゃぐちゃなプログラムというのは、ひとつのメソッドですべて解決しようとしていたり、ロジックが部品化されておらず何百行にわたるメソッドになっていたりします。

それをリファクタリングして、共通に使われる部分、個別で使われる部分の線引きをすれば、共通で使われる部分を継承元として、機能別に小さなクラス(またはメソッド)の集合となり、実際にはかなりの仕様変更に耐えることが多いです。

クラス数が増えることに難色を示す人がいますが、クラス数を増やさないといけないのは、それだけシステムに機能数が増えていることの現れなのです。

また混乱されている原因のうち、プログラマがシンプルに実装出来していない以外の問題として、たまにjavaを正しく理解していない設計者が実権(?)を握っていたりすると、継承回数を抑制したり、機能は減らさないのにメソッド数を抑制したりして実装プログラマや稼動後のメンテナンスプログラマに負担をしいている場合がありますね。

あとアジャイルについては、指摘された本は知りませんが、とにかく「シンプル」に「軽く」作ることですね。

>> 4.privateメソッドの一番外側のメソッドをprotectedにしてそれ
>> を内部クラスかスーパークラス化し、コーディングが頻繁に発生
>> する部分のメンテナンス性を向上させる。
>私の基本的知識不足で完全に理解しきれないのですが,
>非常に役に立ちそうなテクニックのような予感がします.

たとえば doSomething() というpublicメソッドが、doMiddle()というprivateメソッドを呼んでいて、なおかつさらにdoBase()というprivateメソッドが呼ばれているとします。もちろんdoBase()の下にいくつも下位メソ...続きを読む

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してください。

QFinalyメソッドを2回呼べとはどういうことですか?

ガーベージコレクション(FinalyとDispose)の疑問です。

Finalyメソッドを2回呼べとはどういうことですか?

本にはこう書いています。

Disposeメソッドを呼び出すとき、ガーベージコレクションがFinalizeメソッドを呼び出すので合計2回実行される。
クラスフィールドによって、クライアントがDisposeメソッドを2回呼び出しても何も実行しないようにする必要がある。

Finalyメソッドが定義されているオブジェクトをマネージヒープから削除するには、
最低でももう1回はガーベージコレクションを実行しなければならない。
これは、Finalyメソッドによって、現在のオブジェクトがグローバル変数に代入される可能性があるからだ。


Dispseメソッド 2回呼んだらダメ クラスフィールドで回避

Finalyメソッド 2回呼べ     ・・・対応方法不明・・・


Finalyメソッドを2回呼べとはどうしろといっているのですか?

Aベストアンサー

そもそもFinalyメソッドなどと言うものが,.NET Frameworkの標準のライブラリには存在しません。
たまたま,その本のコードでFinalyというメソッドを作っていて,それの実装についての説明か何かなのではないでしょうか。

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関数とメソッドの違い

初歩的な質問なのですが、
関数とメソッドの違いが分からず悩んでいます。
書籍や人によって、
関数とメソッドは同じ物として書いている物もあれば、
メソッドはクラスに関連付いた関数としていたり、
クラスでもpublic関数だけとか、
引数のある物がメソッド、
逆に無い物がメソッド等々…で、
どれが正しいのか良く分からないのです。

関数とメソッドの違いを教えていただけますよう、
お願いいたします。

Aベストアンサー

正解だけ先に言っておきましょう。オブジェクト指向での定義は
「メソッドとは、オブジェクトに送られてきたメッセージを処理するモノ」
「関数とは、メソッドの実装」
ついでに、
「メッセージとは、オブジェクトに何かしらお願いするために送られるモノ」
です。メッセージとメソッドと関数は明確に違うのですよ。


上記の通りなんですが、質問の文について、なにが正しいか、という解答は「文脈による」としか言いよ
うが無いんです。
解説書の一部分だけ抜き出して考えるのは非常に危険な行為です。
文脈を色々変えてみます。例えばオブジェクト指向の話をしているとしたら、

>1. 関数とメソッドは同じ物として書いている物もあれば、
バツ。意味的に全く異なります。
'\0'と""とNULLと0くらい違います。等価なんていってしまったら石が飛びます。(私が投げます:-p)

> 2.メソッドはクラスに関連付いた関数としていたり、
サンカク。C++での実装はそうでしょうが、オブジェクト指向を考える上で、その考え方は危険です。

> 3.クラスでもpublic関数だけとか、
> 引数のある物がメソッド、
> 逆に無い物がメソッド等々…で、
バツ。引数の数でメソッドで無くなる?そんなバカな!
例えprivateでもメソッドですよ。


オブジェクト指向言語C++のことを考えよう!という文脈ならば、
1.サンカク。実装は確かにそうなってます。ですが、上記の通り意味的に違うんです。
2.○。C++において、メソッドは「クラスに関連ついた関数」として実装されてます。
3.そんなわけないでしょう。

オブジェクト指向?なにそれ?構造体に関数がくっついただけでしょ?と乱暴極まりない文脈なら、
1.○。当然!
2.なにいってるの?
3.サブルーチンとファンクションの違いだ!


と、文脈で全然変わるんですよ。これに関しては、本一冊だけだとなかなか気付きにくいです。
是非とも多数の本を読み比べることをお勧めします。

正解だけ先に言っておきましょう。オブジェクト指向での定義は
「メソッドとは、オブジェクトに送られてきたメッセージを処理するモノ」
「関数とは、メソッドの実装」
ついでに、
「メッセージとは、オブジェクトに何かしらお願いするために送られるモノ」
です。メッセージとメソッドと関数は明確に違うのですよ。


上記の通りなんですが、質問の文について、なにが正しいか、という解答は「文脈による」としか言いよ
うが無いんです。
解説書の一部分だけ抜き出して考えるのは非常に危険な行為です...続きを読む

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メソッド宣言内でクラス名が書かれる理由

public static void main(String arg[]){

上記は、メソッド宣言ですが、このメソッド宣言の中に書かれているStringは、「標準クラスの1つ」だと聞いています。(標準クラスの意味さえ僕はわかりませんが、、参考書に書かれてあるのを見てもチンプンカンプン)

何故Stringは標準クラスの1つなのに、メソッド宣言の中に書かれているんですか?

質問1:私の仮説では、メソッドがどこのクラスに属するかを明示するためにメソッド宣言内にStringが書かれていると考えてます。それでよろしいですか?

質問2:メソッド宣言とは本質的にどういうことですか?プログラミング初心者の僕でもわかるように解説お願いします。

Aベストアンサー

public static void main(String arg[]){

は、main というメソッドを定義し、
そのmainメソッドは Stringクラスのインスタンスの配列を引数として得る、
ということを示しています。

( ) の中はそのメソッドが呼ばれたときに受け取る引数を定義しています。

main はすこし特殊で、実際には、この場合は
C:> java program a b c d
と実行されたときに
arg[0] = "a"
arg[1] = "b"
arg[2] = "c"
arg[3] = "d"
と代入されます。
これをmainメソッド内で使うわけですね。

質問1:
ですので、その仮説はまちがってます。
class SampleClass {
public int func(int x, int y) {
return x + y;
}
}
と書いてあったとすれば
メソッド func が クラス SampleClass に属することになります。
そして メソッド func は 引数として x と y を受け取ることになります。

まぁ、つまり、質問者様は 引数 という概念をまだ知らないだけ
ということです。

質問2:
たぶん、他のプログラミング言語もご存知ないのでしょう。
メソッドとは、そのクラス、またはクラスより作られたインスタンス(オブジェクト)
に対する操作である・・・
と、ではわかりませんよね?

人 というクラスを作ったとします。
人クラスから実際のオブジェクトの山田太郎を作りました。
人 山田太郎 = new 人("山田太郎");

山田太郎さんに名前を聞いてみましょう。

山田太郎.名前を教えて();

この"名前を教えて"の部分がメソッドになります。

多少御幣はありますが、
要は
そのクラス、またはオブジェクトに対する操作(命令)がメソッドです。
その命令を作ることがメソッドの宣言です。

命令には補助的な情報が必要な場合があります。

山田太郎.行け("学校");

というふうに行けという命令に、具体的にどこへ、という補助的な情報が必要ですよね。
この"学校"の部分が 引数 というものになります。

main(.....)
の括弧の中はそのメソッドがどんな引数を得るのか、
ということを表現しているのです。

public static void main(String arg[]){

は、main というメソッドを定義し、
そのmainメソッドは Stringクラスのインスタンスの配列を引数として得る、
ということを示しています。

( ) の中はそのメソッドが呼ばれたときに受け取る引数を定義しています。

main はすこし特殊で、実際には、この場合は
C:> java program a b c d
と実行されたときに
arg[0] = "a"
arg[1] = "b"
arg[2] = "c"
arg[3] = "d"
と代入されます。
これをmainメソッド内で使うわけですね。

質問1:
ですので、その仮説はまちがって...続きを読む

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【アクセス修飾子】アクセス修飾子無しのクラスにpublicなメソッド

アクセス修飾子無しのクラスのメソッドにpublicを付ける意味がわかりません。

class MyClass {
 public void method() {}
}

例えばこのようなクラスがあったとします。
このクラスはアクセス修飾子無しで他のパッケージからはアクセス出来ない為、メソッドにpublicを付ける意味は無いと思うのですが、付けてもコンパイルは通ります。

何故なんだろう、と考えてみたのですが、例えばpublicなメソッドを持つpublicなクラスを継承し、そのメソッドをオーバーライドした時にメソッドにpublicを付けざるを得ない、あるいは、インターフェイス(暗黙的にメソッドにpublicが付く)を実装したときにメソッドにpublicを付けざるを得ない等、そういう場合に対応するための『遊び』みたいなものなのでしょうか?

御教授よろしくお願いします。

Aベストアンサー

> 例えばpublicなメソッドを持つpublicなクラスを継承し、そのメソッドをオーバーライドした時にメソッドにpublicを付けざるを得ない、あるいは、インターフェイス(暗黙的にメソッドにpublicが付く)を実装したときにメソッドにpublicを付けざるを得ない等、そういう場合に対応するための『遊び』みたいなものなのでしょうか?

『遊び』ではなく、実際にそのような形で外部のクラスに内部クラスのメソッド等を使わせるような場合に使用します。

例えば、java.util.zip.ZipFile#getInputStreamはInputStreamクラスを返しますが、実装では場合によりInputStreamクラスを継承した内部クラス(内部クラスなのでpublicは付いていない。private)を返します。
readメソッドはオーバーライドされ、独自の実装が加えられていますが、アクセス修飾子はpublicであるため、外部パッケージのクラスからもアクセスすることができます(通常のInputStreamと同じようにreadが出来る)。
詳しくは実際にソースを見て下さい。

> 例えばpublicなメソッドを持つpublicなクラスを継承し、そのメソッドをオーバーライドした時にメソッドにpublicを付けざるを得ない、あるいは、インターフェイス(暗黙的にメソッドにpublicが付く)を実装したときにメソッドにpublicを付けざるを得ない等、そういう場合に対応するための『遊び』みたいなものなのでしょうか?

『遊び』ではなく、実際にそのような形で外部のクラスに内部クラスのメソッド等を使わせるような場合に使用します。

例えば、java.util.zip.ZipFile#getInputStreamはInputStream...続きを読む

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ランキング