ja, hvis du ringte myMethod()
10 ganger vil det skape 10 unike og separate objekter.
new
søkeordet gjør akkurat det det står på tin, det skaper et helt nytt objekt, uavhengig av om man allerede eksisterer. Det skaper et nytt objekt og stuffs referansen til det objektet inne i variabelen det har blitt gitt, overskrive noen tidligere verdi (objekt) variabelen holdt.
omfordeles myobject-variabelen hver gang?
Igjen, ja det ville bli tildelt med et nytt objekt hver gang metoden ble kalt. Et interessant notat om dette ville være at variabelen ikke ville «virkelig» bli tildelt som du definerer variabelen i metodekroppen selv, så hver gang metoden avsluttes, vil den fjerne variablene som ble definert innenfor sitt omfang. Så hva det egentlig gjør er å lage 10 individuelle variabler og tilordne 10 individuelle objekter, men som jeg sa de andre burde ha blitt fjernet automatisk, slik at det ikke ville bruke noe ekstra minne.
I et nøtteskall: skal jeg skrive kode slik bare hvis jeg planlegger å påberope den metoden bare en gang?
Vel som jeg sa, i eksemplet ovenfor ville hvert objekt bli ødelagt på slutten av metodeutførelsen (forutsatt at du ikke tildelte objektreferansen til en variabel utenfor metodens omfang), så i ditt eksempel kan du gjerne ringe metoden så mange ganger du ville, men hver gang ville på ingen måte være koblet til tidligere samtaler.
jeg skjønner at min måte å skrive på kan være forvirrende, så hvis du vil at jeg skal klargjøre noe, bare spør.
‘ hvorfor ikke erklære FileWriter, FileReader, BufferedReader og BufferedWriter på toppen av klassen som de gjorde for de andre variablene?’
Ok, jeg antar at du forstår at variablene egentlig ikke kalles FileWriter
, FileReader
, BufferedReader
, ja BufferedWriter
, men heller dette er variabeltypen. Deres navn er fw
, fr
, br
, og bw
. Hvis du ikke forstår hva jeg mener bare spør. Fra nå av vil jeg referere til variablene med navnene du gjorde for å gjøre lesing enklere, etter alt fw
står bare for FileWriter
uansett, så det bør ikke være for mye forvirring.
nøkkelen til dette spørsmålet er skjult i navnene på variablene selv. Legg merke til hvordan de enten ender i Reader
eller Writer
dette kan gi oss en subtil anelse om deres bruk. Klart FileWriter
og BufferedWriter
er å gjøre med utgang på en eller annen måte. Ved å se over koden ser vi at våre mistanker var riktige, og at disse variablene ikke vises på noe annet sted enn i writeText(JTextArea area)
– metoden. Så hvis variabelen ikke brukes noe annet sted i koden, ville det være logisk fornuftig å definere og initialisere dem innenfor metoden de brukes i, ikke bare gjør det koden lettere å lese fordi vi da «vet» at disse variablene bare er relatert til den metoden, men har også fordelen av at disse variablene blir fjernet ved slutten av metodeutførelsen, og dermed ikke etterlater variabler som bare ble brukt veldig kort. Av disse reglene kan vi si det samme gjelder for FileReader
og BufferedReader
.
Følg dette eksemplet om variabelt omfang. (Se på kommentarene jeg la til koden)
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
Fra dette eksemplet blir det tydeligere hvorfor variablene er definert i metodene i stedet for som instansvariabler og initialisert i konstruktøren. Det gir mye renere kode, så vel som å være mer readabe.
Hvorfor gjøre det hver gang metoden kalles i stedet for å bruke kanskje samme instansvariabel?
vel, dette spørsmålet har å gjøre med variabeltyper. Vi kunne ikke gjenbruke en enkelt variabel for all informasjon, da typene måtte være forskjellige.
hvis vi tar alle variablene fra koden
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
nå vet Vi At Vi ikke kan plassere en verdi som ikke er av samme type som variabelen i den variabelen, så noe som
FileReader fr = new BufferedReader(fr); // Is not valid!
fordi typene ganske enkelt ikke samsvarer.
Gir mening?