Tak, jeśli wywołałeś myMethod()
10 razy, utworzy to 10 unikalnych i oddzielnych obiektów.
słowo kluczowe new
robi dokładnie to, co pisze na puszce, tworzy zupełnie nowy obiekt, niezależnie od tego, czy już istnieje. Wytworzy nowy obiekt i wprowadzi odniesienie do tego obiektu wewnątrz zmiennej, którą podano, nadpisując dowolną poprzednią wartość (obiekt) przechowywanej zmiennej.
czy zmienna myObject jest za każdym razem ponownie przydzielana?
ponownie, tak, będzie ona ponownie przydzielana z nowym obiektem przy każdym wywołaniu metody. Interesującą uwagą na ten temat byłoby to, że zmienna nie byłaby” naprawdę ” ponownie przydzielana, ponieważ definiujesz zmienną w ciele metody, więc za każdym razem, gdy Metoda się zakończy, usunie zmienne, które zostały zdefiniowane w jej zakresie. Tak naprawdę tworzy 10 indywidualnych zmiennych i przypisuje 10 pojedynczych obiektów, chociaż jak powiedziałem, pozostałe powinny zostać usunięte automatycznie, aby nie używać dodatkowej pamięci.
w skrócie: czy powinienem pisać taki kod tylko wtedy, gdy planuję wywołać tę metodę tylko raz?
Cóż, jak już powiedziałem, w powyższym przykładzie każdy obiekt zostanie zniszczony na końcu wykonania metody (zakładając, że nie przypisałeś odniesienia do obiektu do zmiennej spoza zakresu metody), więc w twoim przykładzie możesz szczęśliwie wywołać metodę tyle razy, ile chcesz, ale za każdym razem nie będzie w żaden sposób połączony z poprzednimi wywołaniami.
zdaję sobie sprawę, że mój sposób pisania może być mylący, więc jeśli chcesz, żebym coś wyjaśnił, po prostu zapytaj.
’dlaczego nie zadeklarować FileWriter, FileReader, BufferedReader i BufferedWriter na górze klasy, tak jak to miało miejsce w przypadku innych zmiennych?”
ok, zakładam, że rozumiesz, że zmienne nie są tak naprawdę nazywane FileWriter
, FileReader
, BufferedReader
, i BufferedWriter
, ale raczej jest to typ zmiennej. Ich imiona to fw
, fr
, br
, i bw
. Jeśli nie rozumiesz, co mam na myśli, po prostu zapytaj. Od teraz będę odwoływał się do zmiennych po nazwach, które zrobiłeś, aby ułatwić czytanie, ostatecznie fw
i tak oznacza FileWriter
, więc nie powinno być zbyt wiele zamieszania.
klucz do tego pytania jest ukryty w nazwach samych zmiennych. Zauważ, jak kończą się w Reader
lub Writer
, co może dać nam subtelną wskazówkę na temat ich zastosowań. Wyraźnie FileWriter
i BufferedWriter
mają w jakiś sposób związek z wyjściem. Patrząc na kod widzimy, że nasze podejrzenia były słuszne i że w żadnym innym punkcie niż w metodzie writeText(JTextArea area)
nie pojawiają się te zmienne. Więc jeśli zmienna nie jest używana nigdzie indziej w kodzie, logicznym sensem byłoby zdefiniowanie i zainicjowanie jej w metodzie, w której jest używana, nie tylko ułatwia to odczytanie kodu, ponieważ „wiemy”, że zmienne te są związane tylko z tą metodą, ale także ma tę zaletę, że zmienne te są usuwane pod koniec wykonywania metody, a tym samym nie pozostawiając zmiennych, które były używane bardzo krótko. Zgodnie z tymi zasadami można powiedzieć, że to samo dotyczy FileReader
i BufferedReader
.
obserwuj ten przykład dotyczący zakresu zmiennych. (Spójrz na komentarze, które dodałem do kodu)
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 tego przykładu staje się bardziej jasne, dlaczego zmienne są definiowane w metodach, a nie jako zmienne instancji i inicjowane w konstruktorze. Pozwala na znacznie czystszy kod, a także jest bardziej czytelny.
dlaczego robi to za każdym razem, gdy metoda jest wywoływana, zamiast używać Może tej samej zmiennej instancji?
Cóż to pytanie ma związek z typami zmiennych. Nie mogliśmy ponownie użyć jednej zmiennej dla wszystkich informacji, ponieważ typy musiałyby być różne.
jeśli weźmiemy wszystkie zmienne z kodu
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
teraz wiemy, że nie możemy umieścić wartości, która nie jest tego samego typu co zmienna do tej zmiennej, więc coś w stylu
FileReader fr = new BufferedReader(fr); // Is not valid!
, ponieważ typy po prostu nie pasują.
ma sens?