- ベストアンサー
「static 及び thisについて」とは?
- javaの勉強をしていて、static 及び thisについて理解できない箇所があります。
- 下から2行目のthis.tsum()でコンパイルエラーが発生し、どうしてエラーが起きるのか理解できません。
- また、thisを使わずにpublic static の前にコンストラクタを追加するとエラーが解消されることにも疑問があります。なぜstaticが必要なのでしょうか。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
言い方の問題ですが、例えば、Stringの場合多くのメソッドがありますが、 public String() public String(String value) public String(char[] value) 等、publicでクラスと同名のメソッドがあります。 これを、コンストラクタといい、インスタンス生成時に必ず呼び出されます。 TestInterface obj = new TestInterface(); は変数名を宣言し、インスタンスを生成する文です。 この文を一般的にはコンストラクタと言いません。 ただ、コンストラクタを呼び出してはいます。 morphasさんのソースにはコンストラクタの記述がないようですが、確か明示的に書かない場合はコンパイル時にデフォルトコンストラクタが自動的に生成されるはずです。
その他の回答 (3)
- torakiyojp
- ベストアンサー率58% (25/43)
下の部分の件ですが、 staticなメソッド内ではインスタンス変数は扱えなかったと思います。 staticなメソッド:インスタンス変数 =1:N になるからだと思います。 あと、コンストラクタですが、 static TestInterface obj = new TestInterface(); はコンストラクタを呼んではいますが、コンストラクタではありません。 変数を宣言し、インスタンスを生成する文です。
補足
torakiyojpさん、たびたびありがとうございます。 staticに関しては理解できました。 しかし ”static TestInterface obj = new TestInterface(); はコンストラクタを呼んではいますが、コンストラクタではありません。 変数を宣言し、インスタンスを生成する文です。” の部分で コンストラクタと単なるインスタンス生成はなにが異なるのでしょうか?
- torakiyojp
- ベストアンサー率58% (25/43)
もうしわけありません。 このthisはTestInterfaceクラス自身を指しています。 と、書きましたが、違ったようです。 thisキーワードはインスタンスを示しているようです。クラスは示さないようです。 故に、staticなクラスに対して存在するメソッドの中でthisは使えません。 取り急ぎ謝罪します。
- torakiyojp
- ベストアンサー率58% (25/43)
staticを変数やメソッドの前に付けると、その変数やメソッドはクラスに対して存在することになります。 使用方法は クラス名.変数名 クラス名.メソッド名 というようになります。 逆にstaticを付けない場合は生成されたインスタンスに対して存在することになります。 使用方法は インスタンス名.変数名 インスタンス名.メソッド名 というようになります。 >1.下から2行目this.tsum()でコンパイルエラーになりますが、理由がわかりません。 このthisはTestInterfaceクラス自身を指しています。 ところが、tsum()メソッドはstaticではない為、インスタンスに対して使用されるメソッドです。故にエラーになります。 >2.thisを使うのやめ、public static の前にコンストラクタ TestInterface obj = new TestInterface(); を追加し、 this.tsum()をobj.tsum() に変更したところ、obj.tsum()のところで、エラーになります。コンストラクタにstaticの修飾子をつけるとコンパイルされます。 どうして、staticをつけなければいけないのかわかりません。 コンストラクタがstaticになることはないはずです。 エラーになるはずです。 コンストラクタが何であると考えていますか?
補足
torakiyojpさん、回答ありがとうございます。 まず、staticに関しては、十分理解できました。 しかしもう少し疑問がございますので、よろしければ教えていただけますでしょうか。 tsum()にstaticをつけた後、this.tsum()としてもコンパイルエラーになります。thisをつけずにtsum()とした場合はコンパイルエラーにはなりません。この差はなんなのでしょうか? 次にコンストラクタについてですが、クラスをインスタンス化して、オブジェクトを生成するものと考えています。このときオブジェクトは初期化されます。 クラス名と同じメソッドで、voidがつかず、戻り値の定義もないメソッドと考えています。 System.out.println("Total : "+total); total = total/3; System.out.println("Average : " +total); } TestInterface obj = new TestInterface(); public static void main(String[] args) { obj.tsum(); } } というコードだとobj.tsum()でエラーとなります。 しかし static TestInterface obj = new TestInterface(); public static void main(String[] args) { obj.tsum(); } } とするとエラーになりません。 これはどういうことなのでしょうか。
お礼
torakiyojpさん、非常にわかりやすく教えていただきありがとうございました。 理解できていなかったところが、わかりました。