質問: new Sample(); sc.print(str); } } ``` 上記の場合、変数としてstr"sample"という文字列をクラス直下に宣言。 なぜprint()の引数として、同名のstrを宣言できるのか? strはsampleクラス内が有効なスコープだと思っています。 strを出力した際になぜ、引数が優先されるのか? this.としないかぎり、クラス直下の引数は、メソッド内で使えないのでしょうか? 変数は、クラス直下にあるものは、thisを使うで決定ですか? そして、メソッド内で宣言したローカル変数がメソッド内で有効であるならば、クラス直下で宣言した変数のスコープはどこなんでしょうか?
回答: > > strを出力した際になぜ、引数が優先されるのか? > > > ローカル変数 ⇒ フィールド の順で変数が解決される決まりだからです。 > > this.としないかぎり、クラス直下の引数は、メソッド内で使えないのでしょうか? > > > 同名のローカル変数が無ければ、フィールドが参照されます。 > > 変数は、クラス直下にあるものは、thisを使うで決定ですか? > > > thisを使うことで、フィールドであることを明示できます。 同名のローカル変数が無ければこの文脈のthisは省略できます。 > > そして、メソッド内で宣言したローカル変数がメソッド内で有効であるならば、クラス直下で宣言した変数のスコープはどこなんでしょうか? > > > これは難しいですね。『スコープとはそもそも何ぞや?』という話になってしまうので。 Javaの仕様には次のようにありました。 The Java® Language Specification - Scope of a Declaration > > The scope of a declaration of a member m declared in or inherited by a class type C (§8.1.6) is the entire body of C, including any nested type declarations. > > > スコープは**クラスの内部全体**と規定しているようです。