質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

4回答

1916閲覧

へthisとは何をしてくれるものですか。

pancy

総合スコア11

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2017/05/23 01:13

編集2017/05/23 01:47

javaの文の中によく出てくるthisとは何をしてくれているんでしょうか。
この文章ではなにを意味しているんでしょうか。

java

1コードclass ClassA { 2 private int a; 3 4 public ClassA(int a) { 5 this.a = a;//←←←1 6 } 7 8 public int getA() { 9 return this.a;//←←←2 10 } 11} 12class ClassB { 13 private int b; 14 15 public ClassB(int b) { 16 this.b = b;//←←←3 17 } 18 19 public int getB() { 20 return this.b;//←←←4 21 } 22} 23 24この二つのクラスを継承したClassABを作りたい場合を考えてみましょう。↓のようにできれば良いのですが、これはできません。 25 26class ClassAB extends ClassA, ClassB { 27... 28} 29 30ClassBinterfaceを作り、実装する 31 32次に、擬似的な多重継承のためにClassBのインタフェースを作ります。インタフェースとは、抽象メソッドしか持たない抽象クラスのようなものです(違いについては後記)。 33 34interface InterfaceB { 35 public int getB(); 36} 37「クラスを継承する」のに対して「インタフェースを実装する」と言います。クラスを多重継承することはできませんが、インタフェースは多重実装することができます(抽象メソッドしか持たない抽象クラスを多重継承することはできませんが、インタフェースは多重実装できるという意味で抽象メソッドしか持たない抽象クラスと異なります)。 38 39インタフェースは抽象メソッドしか持たないことが保障されているので、メソッド名の重複が起こっても、その処理の方法を必ずプログラマが記述することになります。 40 41 42ClassBInterfaceBを実装して次のようにします(implements InterfaceBが増えただけ)。 43 44class ClassB implements InterfaceB { 45 private int b; 46 47 public ClassB(int b) { 48 this.b = b;//←←←5 49 } 50 51 public int getB() { 52 return this.b;//←←←6 53 } 54} 55 56ClassABClassAClassBを多重継承したクラス) 57 58まず解説より先に多重継承のソースを示します。 59 60class ClassAB extends ClassA implements InterfaceB { 61 // 多重継承したいClassBのインスタンスを保持する。 62 private ClassB instanceB; 63 64 public ClassAB(int a, int b) { 65 super(a); 66 67 // ClassBのインスタンスを、与えられた引数で生成。 68 this.instanceB = new ClassB(b);//←←←7 69 } 70 71 // InterfaceB#getBメソッドを実装する必要がある。 72 // 動作の中身はinstanceB(ClassB)に完全に任せてしまう。 73 public int getB() { 74 return this.instanceB.getB();//←←←8 75 } 76} 77やっていることは、 78 79InterfaceBを実装 80ClassBのインスタンスをprivateフィールド(instanceB)に保持 81メソッドの中身はinstanceBに丸投げ 82です。 83 84以下、順に解説します。 85 86 87InterfaceBを実装 88 89ClassABにはInterfaceBを実装させます。インタフェースはいくつでも実装できるので、ClassAを継承していようがInterfaceBを実装することができます。 90 91class ClassAB extends ClassA implements InterfaceB { 92 93ClassBのインスタンスをprivateフィールド(instanceB)に保持 94 95次に、多重継承したいクラス(この場合ClassB)のインスタンスを保持するprivateフィールドを作成します。 96 97// 多重継承したいClassBのインスタンスを保持する。 98private ClassB instanceB; 99 100メソッドの中身はinstanceBに丸投げ 101 102あとは、すべてをinstanceBに丸投げしてしまいます。例えば、ClassABで実装しなければならないgetBメソッドは 103 104public int getB() { 105 return this.instanceB.getB();//←←←9 106} 107です。instanceBに仕事をさせて、その結果を返しているだけです。この例ではInterfaceBが持っているメソッドが一つしかありませんが、もし仮に10個のメソッドがあれば、これと同じような丸投げの処理を10個書きます。 108 109 110このようにすれば、InterfaceBのメソッドをすべて持つことを強制された、しかし、その動作はClassBによって決められたClassABを作ることができます。見かけ上は、ClassBを継承しているのと同じです*1111 112 113実行例 114 115ClassABは次のようにして使えます。外から見ると、まるでClassBも継承されているようです。 116 117public class MultipleInheritance { 118 public static void main(String[] args) { 119 ClassAB instanceAB = new ClassAB(100, 200); 120 121 System.out.println(instanceAB.getA()); // 100と表示 122 System.out.println(instanceAB.getB()); // 200と表示 123 } 124} 125 126```[参考にしたサイト](http://d.hatena.ne.jp/Kappuccino/20080812/1218513214)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

thisこのインスタンスを意味するキーワードです。
例えばコンストラクタ(1,3,5,7が該当)では、フィールドと引数に同じ変数名aが使われていますが、
this.aとすることでインスタンスのフィールドであることを明示的に示せます。

それ以外のthisも「このインスタンス自身」を指し、これに続いて.フィールド.メソッド()が続くことで、「このインスタンス自身のフィールドやメソッド」であることを明示的に示しますが、こういう場所で書いてもさほど意味がありません。thisなしでも同じ意味を示しますので。

ではどういうときに使うか?それは、引数に同じクラスの別のインスタンスが入るような状況です。具体的には

  • equals

引数にオブジェクトを取り、そのオブジェクトが自分と等しいか判定するメソッド
基本的にオブジェクト内のフィールドが同じ値かを比較するが、下記のように同名のフィールドを比較することになるため、明確に「このオブジェクトのフィールド」であることを示すためにthisをつけることがある

java

1//ClassA内のメソッドとして説明 2public boolean equals(Object o) { 3 //instanceofなどの判定が入るがここでは本質ではないため省略 4 ClassA x = (ClassA)o; 5 return this.a == x.a; 6}
  • ComparableインタフェースのcompareTo

引数に自分と同じ型のオブジェクトを取り、自分と引数どちらが小さいか(順番に並べるとき、どちらが先に並ぶか)を判定するメソッド
これも多くは同じ名前のフィールドを比較するため、thisで違いを明確化する際に使うことがある

java

1//同じくClassAのメソッドとして説明 2public int compareTo(ClassA another) { 3 if (this.a < another.a) { 4 return -1; 5 } else if (this.a > another.a) { 6 return 1; 7 } else { 8 return 0; 9 } 10}

投稿2017/05/23 01:24

編集2017/05/24 00:48
swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

インスタンスには外側と内側を分ける境界線があります。
外側からは参照型変数を使ってインスタンス内のメソッドやフィールド変数にアクセスします。
内側からはthisを使ってインスタンス内のメソッドやフィールド変数にアクセスします。内側からのアクセスの場合はthisを省略できますが、同名の変数がある場合は明確に識別するためにthisをつけなければいけません。

投稿2017/05/23 02:02

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

あまり詳しくないのですが雰囲気だけお伝えします。

thisとは、オブジェクト生成したモノ自身のことを指しています。

この場合
x = new KeisyoA();
とかで(javaの書き方が違かったらすいません)新しくオブジェクトを生成した場合
このxというオブジェクトはKeisyoAgetAというメソッドを持っています。
KeisyoA内でthis.aでアクセスした時は自分自身、つまりxのもつaという変数(プロパティ)にアクセスしていることになります。

別のオブジェクト(y)を生成したりすると
yのメソッドの中でxのプロパティにアクセスしたりすることもありますので
その場合の区別にもなりますね。

投稿2017/05/23 01:27

Kazuna

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

this ```意味は皆さんが回答していらっしゃる通りです。 ひと言で言うと、```this```とは「このインスタンスの」という意味になります。 わかりにくいと思うので、```this```をつけた場合とつけなかった場合、それぞれが何を示すか考えてみます。 ```java class ClassA { private int a; // フィールドの a public ClassA(int a /* 引数の a */) { this.a = a;//←←←1 } // 下に続く

上のコードは質問コードの抜粋です。ここには2行目と4行目に同じ名前の変数int aがありますね。
//←←←1 の関数に注目します。この関数の中では、aと書いたらどっちのaのことを言ってるの?というのが今回の問題です。
結論を書くと、単なるaは4行目の引数のint aを示し、this.aは2行目のフィールドのint aを示します。今回の例のように、変数名がかぶる場合、引数のほうが優先されます。だから、フィールドのint aを参照したい場合は、thisをつけて「このインスタンスのint a」だとはっきりさせる必要があるのです。

投稿2017/05/23 13:49

chankane

総合スコア139

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問