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

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

ただいまの
回答率

90.04%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 699
退会済みユーザー

退会済みユーザー

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を必要な時と必要ではない時の違いをどのように見分ければ良いのでしょうか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+4

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

class MyClass2 {
    private void func1() {}
    private void func2() {}

    MyClass2() {
        func1();       // ok
        this.func1();  // ok
        func2();       // ok 
        this.func2();  // ok
    }
}

thisが必要な場面...

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

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

class MyClass {
    private int value;

    MyClass(int value) {
        this.value = value;
    }
}

こんな感じですかね。

追記

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

public class Main{
    private String hello = "こんにちは";
    private Sub sub;

    private Main() {
        sub = new Sub(this);
    }
    public void sayHello() {
        System.out.println(hello);
    }

    public static void main(String args[]){
        new Main();
    }
}

class Sub {
    public Sub(Main mainInstance) {
        mainInstance.sayHello();
    }
}

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/02 16:54

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

    キャンセル

  • 2017/08/02 17:05

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

    キャンセル

+2

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる