はい、myMethod()
を10回呼び出した場合、10個の一意で別々のオブジェクトが作成されます。
new
キーワードは、tinに書かれていることを正確に行い、すでに存在するかどうかにかかわらず、新しいオブジェクトを作成します。 新しいオブジェクトを作成し、与えられた変数内のそのオブジェクトへの参照を詰め込み、変数が保持していた以前の値(オブジェクト)を上書きし
myObject変数は毎回再割り当てされますか?
繰り返しますが、メソッドが呼び出されるたびに新しいオブジェクトで再割り当てされます。 これに関する興味深いメモは、メソッド本体自体の中で変数を定義しているときに変数が”実際に”再割り当てされないため、メソッドが終了するたび だから、実際には10個の個々の変数を作成し、10個の個々のオブジェクトを割り当てることですが、私が言ったように、他の変数は自動的に削除されてい
一言で言えば: そのメソッドを一度だけ呼び出す予定の場合にのみ、そのようなコードを書く必要がありますか?
私が言ったように、上記の例では、各オブジェクトはメソッドの実行の最後に破棄されます(オブジェクト参照をメソッドのスコープ外の変数に割り当
私は自分の書き方が混乱する可能性があることを認識しているので、何かを明確にしたい場合は尋ねてください。’他の変数と同じように、FileWriter、FileReader、BufferedReader、およびBufferedWriterをクラスの先頭に宣言しないのはなぜですか?’
さて、私はあなたが変数が実際に呼び出されていないことを理解していると仮定しますFileWriter
, FileReader
, BufferedReader
, そしてBufferedWriter
ですが、むしろこれは変数型です。 彼らの名前は次のとおりですfw
, fr
, br
, とbw
。 私が何を意味するのか理解していない場合は、尋ねてください。 これからは、読みやすくするために行った名前で変数を参照します。afterallfw
はとにかくFileWriter
の略なので、あまり混乱してはいけません。
この質問の鍵は、変数自体の名前の中に隠されています。 それらがReader
またはWriter
でどのように終わるかに注意してください。 明らかにFileWriter
とBufferedWriter
は何らかの形で出力に関係しています。 コードを見ると、私たちの疑惑が正しかったこと、そしてwriteText(JTextArea area)
メソッド内以外ではこれらの変数が現れないことがわかります。 したがって、変数がコード内で他の場所で使用されていない場合、それらが使用されているメソッド内でそれらを定義して初期化することは論理的に理にかなっています。これらの変数がそのメソッドにのみ関連していることを「知っている」ため、コードを読みやすくするだけでなく、メソッドの実行の最後にそれらの変数が削除されるという利点もあり、それによって非常に簡単に使用された変数が存在しないという利点があります。 これらの規則によって、FileReader
とBufferedReader
も同じことが言えます。
変数スコープについてこの例を観察してください。 (私がコードに追加したコメントを見てください)
public class DataBase {private static String buf, retString = "\n"; // buf & retString - createdprivate static File file = new File("test.txt"); // file - createdpublic static void readText(JTextArea area) { try { FileReader fr = new FileReader (file); // fr (FileReader) - created BufferedReader br = new BufferedReader(fr); // br (BufferedReader) - created while ((buf = br.readLine()) != null) { area.append(buf); area.append(retString); } br.close(); fr.close(); } // fr (FileReader & br (BufferedReader) - destroyed catch (IOException e) { System.out.println("Exception: " + e); }}public static void writeText(JTextArea area) { try { FileWriter fw = new FileWriter (file); // fw (FileWriter) - created BufferedWriter bw = new BufferedWriter(fw); // bw (BufferedWriter) - created bw.write(area.getText()); bw.close(); fw.close(); } // fw & bw - destroyed catch (IOException e) { System.out.println("Exception: " + e); }}} // buf, retString and file - Still exist as long as the object exists
この例から、なぜ変数がインスタンス変数としてではなくメソッドで定義され、コンストラクタ内で初期化されるのかがより明確になります。 それははるかにクリーンなコードだけでなく、より多くのreadabeであることができます。
同じインスタンス変数を使用するのではなく、メソッドが呼び出されるたびにそれを行うのはなぜですか?
まあ、この質問は変数の型と関係があります。 型が異なる必要があるため、すべての情報に対して単一の変数を再利用することはできませんでした。
コードからすべての変数を取得すると
private static String buf, retString = "\n"; // validprivate static File file = new File("test.txt"); // validFileReader fr = new FileReader (file); // validBufferedReader br = new BufferedReader(fr); // validFileWriter fw = new FileWriter (file); // validBufferedWriter bw = new BufferedWriter(fw); // valid
今、私たちはその変数に変数と同じ型ではない値を置くことができないことを知っています。
FileReader fr = new BufferedReader(fr); // Is not valid!
型は単純に一致しないためです。
意味を成していますか?