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

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

ただいまの
回答率

90.11%

thisの意味が分かりません。

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,255

cola

score 11

前提・実現したいこと

プログラミング初心者です。
Javaで電卓を作っています。
コードの一番下の三行のthisというのは継承しているJFrameクラスのことを指しているのでしょうか?
thisをsuperに書き換えたら実行できるのですがJFrameと書き換えると下記のエラーが出るので確信を持てずにいます。

発生している問題・エラーメッセージ

型 Window の非 static メソッド setSize(Dimension) を static 参照することはできません

該当のソースコード

package dentaku;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class calculator extends JFrame {
private static final long serialVersionUID = 1L;

JPanel contentPane = new JPanel();
BorderLayout borderLayout1 = new BorderLayout();
JTextField result = new JTextField(""); //計算結果を表示するテキストフィールド
double stackedValue = 0.0; //演算子ボタンを押す前にテキストフィールドにあった値
boolean isStacked = false; //stackedValueに数値を入力したかどうか
boolean afterCalc = false; //演算子ボタンを押した後かどうか
String currentOp = ""; //押された演算子ボタンの名前

//フレームのビルド
public calculator() {
contentPane.setLayout(borderLayout1);
this.setSize(new Dimension(250, 300));
this.setTitle("電子式卓上計算機");
this.setContentPane(contentPane);

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

thisはメソッドを実行中のオブジェクト(インスタンス)を意味します(この場合はcalculatorクラスに属するオブジェクトです。)ちなみにクラスとオブジェクトは別物です。「クラス名.メソッド名」という記述をした場合はstaticメソッドのみ呼び出せます。

「super.メソッド名」と書いた場合、親クラスの方のメソッドを呼び出します。この場合はJFlameにおける同名のメソッドを呼び出そうとします。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/09 14:38

    返事ありがとうございます。
    同じことをしているように思えますが、thisと記述した場合とsuperと記述した場合で何か相違はあるのでしょうか?

    キャンセル

  • 2017/09/09 14:56

    同名のメソッドを上書き定義している場合に、優先順位が変わります。

    superと記述すれば、親クラスのメソッドを呼び出します。thisと書いたり、省略した場合は上書きした子クラスのメソッドを呼び出します。ちなみに、上書き定義していないsuperを使うとどうなるかは調べないとわかりません。

    キャンセル

  • 2017/09/09 16:41

    ありがとうございます。

    今回calculatorクラスでメソッドに上書きしていないのですがthisで動くのが理解できないです。
    どこかで上書きしているのでしょうか?
    それとも上書きされていなければthisを使用したとき親クラスメソッドが自動的に適用されるのでしょうか?

    キャンセル

0

JFrameクラスを指しているのではなく、JFrameのインスタンスを指しています。

public class MyClass {
    private int value_;

    public MyClass(int value) {
        this.value_ = value;
    }
    public void print() {
        System.out.println(this.value_);
    }
    static public void sayHello() {
        // エラー!静的でないフィールドを参照することは出来ない。
        // System.out.println(this.value_);
        System.out.println("hello");
    }
}
public class Main{
    public static void main(String[] args){
        MyClass instance1 = new MyClass(5);
        MyClass instance2 = new MyClass(3);

        instance1.print();
        instance2.print();

        MyClass.sayHello();
    }
}
// 実行結果
5
3
hello

上記の例ではMyClassをひな型に、インスタンスinstance1 instance2を生成しています。
mainメソッドからは呼び分けられるのですが、『一人称』も欲しいところです。それがthisです。
this.value_は、『オイラのvalue_だよ』と言っているのです。


superとthisの挙動が同じように見えるのは、
サブクラスで、ここではcalculatorでメソッドをオーバーライドしていないからです。

public class MyBase {
    public MyBase() {
    }
    public void greet() {
        System.out.println("Hello!");
    }
}
public class MyChild extends MyBase {
    public MyChild() {
    }
    @Override
    public void greet() {
        System.out.println("Hi!");
    }

    public void saySomething() {
        this.greet();   // 出力されるのは: Hi!
        super.greet();  // 出力されるのは: Hello!
    }
}

thisは省略可能である場合も多いです。
質問者様のコードもその一つですが、可読性を高めるために明記しているのかと。
以下の質問が参考になるかもしれません。
https://teratail.com/questions/86708

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/09 14:38 編集

    返事ありがとうございます。

    リンク先、参照してみます。

    キャンセル

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

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

同じタグがついた質問を見る