[???] /
[Java FAQ] / [S013]
S013: 名前
[S013 Q-01]
メソッド、変数がどこで宣言されているかどうやって調べたら良いのでしょうか?
[S013 A-01]
以下の要領となります。
より近いスコープから外側に向けて調べます。
◆ メソッドの場合
(1) そのクラスで宣言されているかどうか調べる。
(2) そのクラスのスーパークラスで宣言されているかどうか調べる。
メソッド名の前にsuperがついている場合は、(1)は不要。
◆ 変数の場合
(1) すぐ外側の"{"〜"}"の中の宣言を調べる。
(2) 次に外側の"{"〜"}"の中の宣言を調べる。
....
(3) メソッドのローカル変数宣言を調べる。
(4) メソッドのパラメタとして宣言されているかどうか調べる。
(5) インスタンス変数、クラス変数として宣言されているかどうか調べる。
(6) スーパークラスで宣言されているかどうか調べる。
変数名の前にthisがついている場合は、(1)〜(4)は不要。
変数名の前にsuperがついている場合は、(1)〜(5)は不要。
スーパークラスの変数やメソッドを探すには、javadoc文書を使用すると便利です。
[S013 Q-02]
クラスがどこで宣言されているかどうやって調べたら良いのでしょうか?
[S013 A-02]
そのクラスのパッケージを調べます。
◆ 使用している場所またはimportで、FQCNで記述している場合
そのFQCNに含まれるパッケージに定義されています。
◆ 使用している場所でクラス名のみで記述していてimportではパッケージ名のみ
記述している場合
importで記述しているパッケージでそのクラスが定義されているか
1つずつ調べる必要があります。
パッケージに宣言されているクラスを確認するには、
javadoc文書を使用すると便利です。
クラスの宣言されているパッケージを順に調べる作業は、大変面倒なので、
あまりにも明らかな場合を除いて、importに「*」を使わないほうがよいでしょう。
[S013 Q-03]
$ がついたクラスが生成されるのですが、これは何ですか?
[S013 A-03]
$ 記号のつく .class ファイルは内部クラスが存在する場合に
コンパイラによって作成されます。
$ 記号のつく .class ファイルは プログラム実行時に必要です。
作業ファイル(や一時ファイル)と間違って削除しないように気をつけましょう。
[S013 Q-04]
同名のメソッドと変数というのは許されるのでしょうか?
[S013 A-04]
許されます。文法的には問題ありません。
[S013 Q-05]
変数名・メソッド名・クラス名に日本語は使えるのでしょうか?
[S013 A-05]
JDK 1.1 以降なら、ソース中に変数名・メソッド名として日本語を使用しても
正しくコンパイルされ、動作します。
--
public class Test {
private Test(String 引数) {
System.out.println("メソッドの引数は" + 引数 + "です。");
}
public static void main(String[] args) {
new Test("日本語");
}
}
--
なお、JDK 1.0.x の場合は、javac での Unicode 変換が自動では行われないため、
日本語を使用したい場合は "\u" で始まる 4桁の 16進数で指定する必要が
あります。
クラス名には日本語が使用できません。
[S013 Q-06]
なぜスーパークラス(またはインタフェース)の型の変数に代入するのですか?
[S013 A-06]
複数の異なるクラスのオブジェクトを同じクラス(インタフェース)の
オブジェクトとして扱うためです。
以下の例では、画面コンポーネントを一つの配列に代入しています。
--
import java.awt.*;
// 中略 //
Component[] components = new Component[3];
components[0] = new Button();
components[1] = new TextField();
components[2] = new Label("Hello");
--
Button, TextField, Label はともに Component のサブクラスなので、
Component 型の変数に代入することができます。すると、
これらを Component 型のオブジェクトとして統一的に扱うことが
できるようになります。
--
for (int i = 0; i < components.length; i++) {
System.out.println("name = " + components[i].getName());
}
--
次の例では、任意のリスト(java.util.List)を引数として、
そのリストを逆順にする次のようなメソッドを考えてみます。
void reverse(List list) { ... }
こうすることによって List を実装する任意のクラスのインスタンスを
引数として渡すことができます。
--
import java.util.*;
// 中略 //
Vector v = new Vector();
...
reverse(v);
--
ArrayList al = new ArrayList();
...
reverse(al);
--
reverse メソッド内では引数として与えられたオブジェクトが、
Vectorであろうが ArrayList であろうが、List インタフェースが実装されている
クラスのオブジェクトであれば何でも扱うことができます。
contributor: markn
コメントの送り先 Java FAQ BBS