Da, Dacă ați sunat myMethod()
de 10 ori va crea 10 obiecte unice și separate.
cuvântul cheie new
face exact ceea ce scrie pe tablă, creează un obiect nou, indiferent dacă există deja unul. Creează un obiect nou și umple referința la acel obiect în interiorul variabilei care i-a fost dată, suprascriind orice valoare anterioară (obiect) a variabilei deținute.
variabila myObject este realocată de fiecare dată?
din nou, DA, ar fi realocată cu un obiect nou de fiecare dată când metoda a fost apelată. O notă interesantă despre acest lucru ar fi că variabila nu ar fi „cu adevărat” realocată pe măsură ce definiți variabila în corpul metodei în sine, astfel încât de fiecare dată când metoda se termină, va elimina variabilele care au fost definite în domeniul său de aplicare. Deci, ceea ce face de fapt este să creeze 10 variabile individuale și să atribuie 10 obiecte individuale, deși, așa cum am spus, celelalte ar fi trebuit eliminate automat, astfel încât să nu folosească nicio memorie suplimentară.
pe scurt: ar trebui să scriu un astfel de cod numai dacă intenționez să invoc această metodă o singură dată?
Ei bine, așa cum am spus, în exemplul de mai sus, fiecare obiect ar fi distrus la sfârșitul executării metodei (presupunând că nu ați atribuit Referința obiectului unei variabile în afara domeniului de aplicare al metodei), astfel încât în exemplul dvs. să puteți apela fericit metoda de câte ori doriți, dar de fiecare dată nu ar fi în niciun fel conectat la apelurile anterioare.
îmi dau seama că felul meu de a scrie poate fi confuz, așa că dacă vrei să clarific ceva, întreabă.
‘ de ce să nu declarați FileWriter, FileReader, BufferedReader și BufferedWriter în partea de sus a clasei așa cum au făcut-o pentru celelalte variabile?’
bine, presupun că înțelegeți că variabilele nu sunt numite de fapt FileWriter
, FileReader
, BufferedReader
, și BufferedWriter
, ci mai degrabă acesta este tipul de variabilă. Numele lor sunt fw
, fr
, br
, și bw
. Dacă nu înțelegi ce vreau să spun, întreabă. De acum înainte mă voi referi la variabilele după numele pe care le-ați făcut pentru a face citirea mai ușoară, după toate fw
doar înseamnă FileWriter
oricum, deci nu ar trebui să existe prea multă confuzie.
cheia acestei întrebări este ascunsă în numele variabilelor în sine. Observați cum se termină fie în Reader
, fie în Writer
acest lucru ne poate oferi un indiciu subtil despre utilizările lor. În mod clar FileWriter
și BufferedWriter
sunt de a face cu ieșire într-un fel. Privind peste cod, vedem că suspiciunile noastre au fost corecte și că în niciun alt moment decât în cadrul metodei writeText(JTextArea area)
nu apar aceste variabile. Deci, dacă variabila nu este utilizată în altă parte în cod, ar avea sens logic să le definim și să le inițializăm în cadrul metodei în care sunt utilizate, nu numai că face Codul mai ușor de citit, deoarece atunci „știm” că acele variabile sunt legate doar de acea metodă, dar are și beneficiul ca acele variabile să fie eliminate la sfârșitul executării metodei, astfel încât să nu lăsăm variabile în existență care au fost folosite doar foarte scurt. Prin aceste reguli putem spune că același lucru este valabil și pentru FileReader
și BufferedReader
.
observați acest exemplu despre domeniul variabil. (Uită-te la comentariile pe care le-am adăugat la cod)
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
din acest exemplu devine mai clar de ce variabilele sunt definite în metode, mai degrabă decât ca variabile de instanță și inițializate în cadrul constructorului. Acesta permite codul mult mai curat, precum și a fi mai readabe.
de ce să o faci de fiecare dată când metoda este numită mai degrabă decât să folosești poate aceeași variabilă de instanță?
Ei bine, această întrebare are legătură cu tipurile de variabile. Nu am putut reutiliza o singură variabilă pentru toate informațiile, deoarece tipurile ar fi trebuit să fie diferite.
dacă luăm toate variabilele din Codul
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
acum știm că nu putem plasa o valoare care nu este de același tip cu variabila în acea variabilă, deci ceva de genul
FileReader fr = new BufferedReader(fr); // Is not valid!
deoarece tipurile pur și simplu nu se potrivesc.
are sens?