Wpis z mikrobloga

#java
ocjp

Mam pytanie w książce: "Mariusz Lipiński przygotowanie do OCPJ6" jest napisane:

str. 48

Typ MethodLocalClass nie jest znany poza metodą w której został

zdefiniowany, jednak nie przeszkadza to nam jak widać posługiwać się instancjami

tej klasy poza tą metodą. Obiekty przechowywane są w pamięci na stercie (także

instancje klas lokalnych), podczas gdy zmienne lokalne metod na stosie, w

segmencie przypisanym do danej metody. Obiekty są usuwane ze sterty przez

mechanizm oczyszczania pamięci (ang. garbage collector) dopiero gdy przestają

być one użyteczne, natomiast segment stosu przechowujący zmienne lokalne

metody kasowany jest natychmiast po zakończeniu się metody. Instancje klasy

lokalnej mogą żyć więc dłużej (dużo dłużej) niż zmienne lokalne metody. Wynika

stąd jedna bardzo ważna konsekwencja – klasy lokalne nie mają dostępu do

zmiennych lokalnych metody! Rozważmy kolejny wariant metody someOp():


public Object someOp() {
int x = 123;

class MethodLocalClass {
public String toString() {
return "x == " + x; // błąd! nie możemy odwołać się do zmiennej x
}
}
return new MethodLocalClass();
}

Jak wiemy kod ten nie skompiluje się; wywołanie metody toString() na

instancji klasy MethodLocalClass poza metodą someOp() nie byłoby

bowiem możliwe. Zmienna x – składowana na stosie w segmencie przypisanym do

metody someOp() – po zakończeniu się tej metody przecież nie istnieje – nie

możemy więc pobrać wartości tej zmiennej. Od tej zasady jest jednak prosty

wyjątek – możemy mianowicie odwoływać się do zmiennych finalnych. Zmienne

finalne to zmienne których wartość nie może się już nigdy zmienić, zatem

kompilator może po prostu w miejsce odwołania się do finalnej zmiennej lokalnej

podstawić wartość tej zmiennej. Zmodyfikowanie powyższej metody someOp()

w ten sposób, że zmienną x oznaczylibyśmy modyfikatorem final

spowodowałoby więc że kod byłby poprawny. Naturalnie tak jak z kodu metody

tak z kodu klasy zadeklarowanej wewnątrz tej metody mamy bezpośredni dostęp

do wszystkich zmiennych i metod z klasy zewnętrznej. Pamiętajmy jednak o tym,

WWW .OCPJP .NET

48

PRZYGOTOWANIE DO CERTYFIKACJI OCPJP 6

M ARIUSZ LIPIŃSKI

że tak jak metoda statyczna ma dostęp tylko i wyłącznie do zmiennych statycznych

tak analogicznie klasa zdefiniowana wewnątrz metody statycznej ma dostęp tylko i

wyłącznie do zmiennych statycznych klasy zewnętrznej.


Ok próbowałem samemu to sprawdzić mój kod:
http://wklej.to/SiHXa

Wyświetla się na konsoli:

this.value: MethodLocalClass value

value: MethodLocalClass value 0

OuterClass.this.value: Zmienna prywatna - OuterClass

OuterClass.InnerClass.this.value: Zmienna prywatna - InnerClass

getLocalMethodVariableValue(): LocalField = 0

innerclasses.OuterClass$InnerClass$1MethodLocalClass


Jak w końcu z tymi zmiennymi lokalnymi i klasami lokalnymi metod. Mogłem odnieść się do zmiennej lokalnej i kod się skompilował.
  • 7
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

ocpj akurat jest ceniony na rynku


@kondziow: Chyba jak porównujesz dwóch studentów bez doświadczenia. Jeden programista z rocznym doświadczeniem bije pięciu studentów bez doswiadczenia i z certyfikatami.
  • Odpowiedz
@JavaEngineer Od javy 8 zmienne lokalne mogą być traktowane jako effectively final. Tzn jeśli nigdy nie zmieniły swojej wartości to kompilator przekształci je na zmienne finalne. Spróbuj w dowolnym miejscu w metodzie testLocalInnerClass() zmienić wartość localField, a kod przestanie się kompilować.
  • Odpowiedz
@cebulowa_zydomasokomuna:

#java

However, starting in Java SE 8, a local class can access local variables and parameters of the enclosing block that are final or effectively final. A variable or parameter whose value is never changed after it is initialized is effectively final. For example, suppose that the variable numberLength is not declared final, and you add the highlighted assignment statement in the PhoneNumber
  • Odpowiedz