• ベストアンサー

thisキーワード

すいません、ソースコードをいくつか見ても感触がつかめないので質問させてください。((((((~  ̄ー ̄)~ えと、ソースコードに this.id = new id みたいなのがあるのですがthisの意味が分かりません。「このクラスの」という意味かと思っていたら全然違うところで使われていたり・・・ 辞書的には「カレントディレクトリーへの参照」となっているのですが、頭が固くて理解できません。どういう意味なんですかね?? あと、同様に本の解説では throwの意味も曖昧で分かりません・・・m(_"_)m

質問者が選んだベストアンサー

  • ベストアンサー
noname#18558
noname#18558
回答No.1

thisが、「このクラスの」というのは誤解です。 「このインスタンスの」が正解です。 こういうときに使います。 public class Hoge { // インスタンス変数 private int name = 0; public void setName(int name) { // インスタンス変数と引数を区別するために使う this.name = name; public int getName() { //これは、どっちもおなじ意味 return name; //return this.name } } throwは、そのままですね。 自分で例外を発生させたい場合に使います。

javatea_1985
質問者

補足

ありがとうございます。 しかし this.name = name; の意味っていうのはなんなんですかね?? return nameと return this.nameが同じなのはなんとなく分かるのですが・・

その他の回答 (2)

回答No.3

頭を整理しましょう。 No.1さんのソースの上から順に以下のように番号を振ります。 public class Hoge { // インスタンス変数 private int name = 0・・(1); public void setName(int name・・(2)) { // インスタンス変数と引数を区別するために使う this.name ・・(3)= name・・(4); } public int getName() { //これは、どっちもおなじ意味 return name・・(5); //return this.name・・(6) } } まず、(1)がこのクラスで宣言された"name"です。つまり、メソッド内だけではなく全体に宣言されたため、この後このクラス内で出てくる"name"は基本的に(1)を指します。よって、(5)、(6)は(1)と同様のものです。 しかし、Javaでは、メソッドやコンストラクタの内部では同じ名前の変数や引数が宣言できます。これが(2)です。この同じ名前の変数"name"は、そのメソッドやコンストラクタの内部でのみ有効な変数です。つまり、(4)は(2)と同じものになります。 では、このメソッドの内部でクラスで定義した変数の(1)を使いたいときはどうしたらいいのでしょうか?実はこれを呼び出す方法が(3)である"this.name"なのです。 これで、 >this.nameのnameがフィールド変数のnameなのですか、それともgetName()メソッドの引数のnameなのですかね?? の答えがわかりましたね? ここで、setNameの変数を"name"じゃない別の変数を用いることももちろんできます。すると public void setName(int hoge) { name = hoge; //this.name=hoge; //もちろんこれも同じ意味 } という表記でOKとなり、わざわざthis.name=name;という一見よくわからないコードを書かなくてよくなる様に見えます。 で、なんでこのような一見よくわからないコードを書くかと言うと、 name = hoge; と書くよりも this.name=name; と書くほうが「両辺に同じ意味を持つ値を代入していることが明確になる」からです。 つまり、ある「貯金箱」クラスが「お金」という名前の変数を持っていたとき、「貯金」メソッドの引数の名前としては「テレビ」(引数の名前だけテレビとしていても中身はお金を代入すると言う意味です)とか「ビデオ」とか「ホゲ」みたいな別の名前にするよりは、あっさり「お金」という変数にした方がわかりやすいですよね? まぁ、わざわざ全く別の名前にしないで public void setName(int set_name) { name = set_name; } とすればいいだけのような気もしますが、これは個人の好みの問題です。意味を理解した上で this.name=name; でも name=set_name;でも自分の好きな方を使ってください。(まぁ、Javaの慣習ではもちろんthis.name=name;を使うわけですが)

javatea_1985
質問者

お礼

なるほど、 >両辺に同じ意味を持つ値を代入していることが明確になる わけですね。 理由が分かると覚えやすいです。 詳しいご解答ありがとうございました。m(__)m

noname#235174
noname#235174
回答No.2

this.name = name; ↑はフィールド変数にnameという名前の変数と 引数のnameという同じ名前の変数があるので 明示的にどのname変数かを指し示すためにthisを使っています。 そうしないと、引数に引数を代入するという意味不明のコードになるからです。

javatea_1985
質問者

補足

すいません、これが最後の質問なのですが、 this.nameのnameがフィールド変数のnameなのですか、 それともgetName()メソッドの引数のnameなのですかね?? 書いていて気分が沈んでくるのですが、よろしくお願いします。

関連するQ&A