Ano, Pokud jste volali myMethod()
10krát, vytvoří 10 jedinečných a samostatných objektů.
Klíčové slovo new
dělá přesně to, co říká na DIČ, vytváří zcela nový objekt, bez ohledu na to, zda již existuje. Vytvoří nový objekt a vloží odkaz na tento objekt uvnitř proměnné, kterou dostal, přepsáním jakékoli předchozí hodnoty (objektu) držené proměnné.
je proměnná myObject přerozdělena pokaždé?
opět Ano, Bylo by znovu přiděleno novému objektu při každém volání metody. Zajímavou poznámkou o tom by bylo, že proměnná by nebyla“ opravdu “ znovu přidělena, protože definujete proměnnou v samotném těle metody, takže pokaždé, když metoda skončí, odstraní proměnné, které byly definovány v jejím rozsahu. Takže, co to vlastně dělá, je vytvořit 10 jednotlivé proměnné a přiřadit 10 jednotlivých objektů, i když, jak jsem řekl, ostatní měly být odstraněny automaticky, takže to nebude používat žádnou další paměť.
v kostce: mám napsat takový kód pouze tehdy, pokud mám v plánu tuto metodu vyvolat pouze jednou?
No jak jsem řekl, v příkladu výše, každý předmět bude zničen na konci realizace metody (za předpokladu, že jste neměl přiřadit odkaz na objekt do proměnné mimo metodu), takže ve vašem příkladu jste mohli šťastně volat metodu tolikrát, kolikrát jste chtěli, ale pokaždé, když by být v žádném případě připojen na předchozí hovory.
uvědomuji si, že můj způsob psaní může být matoucí, takže pokud chcete, abych něco objasnil, zeptejte se.
‚ proč ne deklarovat FileWriter, FileReader, BufferedReader a BufferedWriter na vrcholu třídy, jako tomu bylo u ostatních proměnných?‘
Ok, předpokládám, že jste pochopili, že proměnné nejsou ve skutečnosti tzv. FileWriter
, FileReader
, BufferedReader
, a BufferedWriter
, ale spíše je to typ proměnné. Jejich jména jsou fw
, fr
, br
, a bw
. Pokud nechápete, co tím myslím, zeptejte se. Od této chvíle budu odkazovat na proměnné jmény, které jste udělali, aby bylo čtení snadnější, koneckonců fw
prostě znamená FileWriter
tak jako tak, takže by nemělo být příliš mnoho zmatků.
klíč k této otázce je skrytý v názvech samotných proměnných. Všimněte si, jak buď končí v Reader
nebo Writer
to nám může poskytnout jemnou stopu o jejich použití. Je zřejmé, že FileWriter
a BufferedWriter
mají co do činění s výstupem nějakým způsobem. Při pohledu na kód vidíme, že naše podezření byla správná a že se tyto proměnné neobjevují v žádném jiném bodě než v rámci metody writeText(JTextArea area)
. Takže pokud proměnné nejsou používány nikde jinde v kódu by dávalo logický smysl definovat a inicializovat je v rámci metody, které jsou používány, a to nejen dělá kód čitelnější, protože jsme pak „ví“, tyto proměnné se týkají pouze tuto metodu, ale také tu výhodu, že tyto proměnné budou odstraněny na konci realizace metody, čímž se nenechám proměnných v existenci, které byly použity pouze velmi stručně. Podle těchto pravidel můžeme říci, že totéž platí pro FileReader
a BufferedReader
.
sledujte tento příklad o proměnném rozsahu. (Podívejte se na komentáře, které jsem přidal do kódu)
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
z tohoto příkladu je jasnější, proč jsou proměnné definovány spíše v metodách než jako proměnné instance a inicializovány v konstruktoru. To umožňuje mnohem čistší kód, stejně jako je více readabe.
proč to dělat pokaždé, když je metoda volána, spíše než používat možná stejnou proměnnou instance?
no tato otázka má co do činění s typy proměnných. Nemohli jsme znovu použít jednu proměnnou pro všechny informace, protože typy by se musely lišit.
Když vezmeme všechny proměnné z kódu
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
Nyní víme, že nemůžeme umístit hodnotu, která není stejného typu jako proměnná, do které variabilní, takže něco jako
FileReader fr = new BufferedReader(fr); // Is not valid!
Protože typy prostě neodpovídají.
dává smysl?