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

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

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

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

Q&A

解決済

1回答

2473閲覧

宣言時のエラー及びthisの使い方

Jhon_McClane

総合スコア48

Java

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

0グッド

1クリップ

投稿2020/07/26 03:09

前提・実現したいこと

private,thisが使えない理由が分かりませす。
public static void mainのなかにprivateなどはかけないのでしょうか。
またこのコードの場合はthisを必要はないですか。(区別するものがなく一意に特定できるため)

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

x1,x2,y1,y2において1.のエラーメッセージ
thisにおいて2.のメッセージ

1. Illegal modifier for parameter x1; only final is permittedJava(67109220) 2. Cannot use this in a static contextJava(536871112)

該当のソースコード

public class Main { public static void main(String[] args) { private double x1, y1, x2, y2; Input in = Input(); this.x1 = in.inputDouble("端点1のx1の値を入力してください"); this.y1 = in.inputDouble("端点2のx2の値を入力してください"); this.x2 = in.inputDouble("端点1のy1の値を入力してください"); this.y2 = in.inputDouble("端点2のx2の値を入力してください"); LinerSegment beforeLine = new LinerSegment(this.x1, this.y1, this.x2, this.y2); LineSegment afterLine = beforeLine.linearTransfer(); System.out.println("Input LineSegment :" + beforeLine + "\n => LineSegment after linearTransfer :" + afterLine); } }

試したこと

private を消したところ変数のエラーが消えた。
thisも消したらエラーは消えた。

補足情報(FW/ツールのバージョンなど)

VScode 1.47.2

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

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

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

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

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

guest

回答1

0

ベストアンサー

private等のアクセス指定子を付けられるのは、クラス内では、フィールドやメソッドです。
メソッドの内部で宣言した変数はローカル変数となるので、アクセス指定子は付けられません。
(そもそも外部からアクセスできません)

thisは、自インスタンスを示すキーワードなので、this.○○と書いた場合、
○○は、自インスタンスのフィールドを指しますが、このクラスにはそのフィールドは宣言されていません。
宣言されていないフィールドへのアクセスはエラーになります。

thisを外した場合、最も近い位置にあるローカル変数が対象になるので、エラーでなくなります。

アクセス制御をしたい場合、ローカル変数ではなく、フィールドにしてください。
(thisの有無は重複とは無関係です。重複していなくとも使えます)

mainメソッドはstaticなクラスメソッドなので、自分のインスタンスを持たず、
インスタンスフィールドにはアクセスできません。
その為、その中でthisを使うこともできません。
(自インスタンスが存在しないので、それを表すthisも使えない)

変数をローカル変数として、アクセス指定子とthisを外した状態にしてください。
privateと指定せずともローカル変数には外部からはアクセスできません。
また、ローカル変数へのアクセスにはthisは不要です

Java

1public class Main { 2 3 public static void main(String[] args) { 4 5 double x1, y1, x2, y2; 6 7 Input in = Input(); 8 9 x1 = in.inputDouble("端点1のx1の値を入力してください"); 10 y1 = in.inputDouble("端点2のx2の値を入力してください"); 11 x2 = in.inputDouble("端点1のy1の値を入力してください"); 12 y2 = in.inputDouble("端点2のx2の値を入力してください"); 13 14 LinerSegment beforeLine = new LinerSegment(x1, y1, x2, y2); 15 LineSegment afterLine = beforeLine.linearTransfer(); 16 System.out.println("Input LineSegment :" + beforeLine + 17 "\n => LineSegment after linearTransfer :" + afterLine); 18 } 19}

投稿2020/07/26 03:18

編集2020/07/26 19:03
amiya

総合スコア1218

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

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

Jhon_McClane

2020/07/26 06:41

フィールドに変更したところCannot make a static reference to the non-static field x1 のエラーが出ました。とりあえずstaticにしたのですが、作りあげるコードはstaticにする必要がないかなと考えています。そのためローカル変数に使用と思います。
Jhon_McClane

2020/07/26 06:44

thisはインスタンスを指すと言うことはプリミティブ型には使えないと言うことで合っているでしょうか.
shiketa

2020/07/26 08:01

きちんと読もう。「自」が抜けてますよ。 > ...thisは、自インスタンスを示すキーワードなので...
kazuma-s

2020/07/26 15:49

amiya さん、この回答はなんですか? コンパイルしてみましたか? Mainクラスは new していないのでインスタンスは存在しません。 Mainクラスのフィールドである x1 も存在しません。 インスタンスが無いので this も使えません。
amiya

2020/07/26 18:44

ああ。すみません。大ボケかましてました(汗) あとから書き足した後半が完全に蛇足でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問