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

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

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

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

Q&A

解決済

2回答

9908閲覧

thisを必要な時と必要ではない時の違い

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

1クリップ

投稿2017/08/02 07:19

Javaを勉強中です。
thisを必要な時と必要ではない時の違いがわかりません。

class CustomerCard{ int id; String name; String address; double shoeSize; CustomerCard(int id,String name,String address,double shoeSize){ this.id = id; this.name = name; this.address = address; this.shoeSize = shoeSize; } void printInfo(){ System.out.println("ID:"+this.id); System.out.println("氏名"+this.name); System.out.println("住所:"+this.address); System.out.println("靴のサイズ:"+this.shoeSize); } } class CustomerManager{ public static void main(String args[]){ CustomerCard[] cards = new CustomerCard[100]; cards[0] = new CustomerCard(1001,"山田太郎","東京都",26.5); cards[1] = new CustomerCard(1002,"佐藤花子","神奈川県",24.5); cards[2] = new CustomerCard(1003,"鈴木健児","茨城県",26.0); for (int i = 0;i < 100;i++){ if(cards[i] == null){ break; } System.out.println(i + "番目の顧客カードに記載の情報"); cards[i].printInfo(); System.out.println("==============="); } } }

と書いたコードを実行すると目的のアウトプットができました。
一方で
printInfo()を

void printInfo(){ System.out.println("ID:"+id); System.out.println("氏名"+name); System.out.println("住所:"+address); System.out.println("靴のサイズ:"+shoeSize); }

と書いても最初のコードと同じアウトプットができました。
ここで分からなくなったのが、thisを必要な時と必要ではない時の違い です。
本には、this.変数は
「インスタンスから見た自分自身のインスタンス変数」という意味になるそうで、この自分自身のインスタンス変数の意味が理解できませんでした。
thisを必要な時と必要ではない時の違いをどのように見分ければ良いのでしょうか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

基本的には、thisは省略されているものだと思っておけばいいです。

Java

1class MyClass2 { 2 private void func1() {} 3 private void func2() {} 4 5 MyClass2() { 6 func1(); // ok 7 this.func1(); // ok 8 func2(); // ok 9 this.func2(); // ok 10 } 11}

thisが必要な場面...

  • 仮引数名と、自身のフィールドが同名で、区別する必要がある場合
  • 自分自身を渡す場合

例えば、次の場合はthisが必須です。

Java

1class MyClass { 2 private int value; 3 4 MyClass(int value) { 5 this.value = value; 6 } 7}

こんな感じですかね。

追記

『自分自身を渡す』というのは確かに想像しづらいですね。
例えば、こういうことが出来ます。

Java

1public class Main{ 2 private String hello = "こんにちは"; 3 private Sub sub; 4 5 private Main() { 6 sub = new Sub(this); 7 } 8 public void sayHello() { 9 System.out.println(hello); 10 } 11 12 public static void main(String args[]){ 13 new Main(); 14 } 15} 16 17class Sub { 18 public Sub(Main mainInstance) { 19 mainInstance.sayHello(); 20 } 21}

SubインスタンスからMainのインスタンスを参照しています。
このコードだとよくメリットが分からないかもしれませんが、GUIを組むときなどに多用します。
追々用途はわかってくるかと。

...このコードはあんまりいい例じゃないですね。思いつかないなぁ。

投稿2017/08/02 07:24

編集2017/08/02 08:08
LouiS0616

総合スコア35660

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

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

退会済みユーザー

退会済みユーザー

2017/08/02 07:54

ありがとうございます。自分自身を渡す場合とはどういう状況でしょうか?インスタンス変数の変数を見たい時ということでしょうか?
LouiS0616

2017/08/02 08:05

追記しました。GUIを組みだすと有難みが分かるようになります。
guest

0

printInfoが以下のような実装になった場合

Java

1void printInfo(int id){ 2 String name = "local"; 3 System.out.println("ID:" + id); 4 System.out.println("氏名" + name); 5 System.out.println("住所:" + address); 6 System.out.println("靴のサイズ:" + shoeSize); 7}
  • idはメソッドの引数のidが使われる
  • nameはメソッドの冒頭で宣言しているnameが使われる。つまり "local" と出力される。
  • 他はインスタンス(this)の値が使われる

名前がかぶっているものは、一番近いものが使われます。
メソッドも、親クラスと自分で同名のメソッドがあった場合、
単純にメソッド名で呼ぶと、自分の方が呼ばれます。
親の方を呼びたければ、super.method() とする必要があります。

addressとshowSizeはメソッド内で同じ名前のものがないから、thisの値が使われます。
この時に引数のidや、メソッド内で宣言しているnameの値を見ずに
インスタンス変数の方を見たい場合、this.id, this.name とする必要があります。

メソッドであれ変数であれ、名前がかぶってなければthisを使わなくても問題はありません。
「この変数はインスタンスの値を見ている」というのを、パッと見で分かりやすくするように
あえてthisを付けることがありますが、つけなくても動きは変わりません。

投稿2017/08/02 07:41

root_jp

総合スコア4666

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問