In search this blog

Loading

piątek, 9 września 2011

Assignments


Stos i Sterta (Stack and Heap)

  • Zmienne lokalne żyją na stosie (stack)
  • Obiekty i zmienne klasowe żyją na stercie

Literały i rzutowania typów prymitywnych

  • Literały dla liczb całkowitych mogą być zapisywane w systemie dziesiętnym(decimal) np. 9, ósemkowym(octal) np. 013, lub szesnastkowym(hexadecimal) np. 0x2a
  • Literał dla typu long musi kończyć się L lub l
  • Literał dla typu floatmusi kończyć się F lub f, double literał kończy się liczbą lub D lub d
  • Literałem dla typu booleantrue lub false
  • Literałem dla char jest pojedynczy znak zawarty pomiędzy apostrofami np. 'a'

Zakresy (Scope)

  • Zakres decyduje o długości życia zmiennej
  • Cztery podstawowe zakresy:
    • Zmienne statyczne żyją przeważnie tak długo jak długo żyje ich klasa
    • Zmienne klasowe żyją tak długo jak długo żyje ich obiekt
    • Zmienne lokalne żyją tak długo jak długo żyją ich metody na stosie; jakkolwiek kiedy ich metoda wywołuje inną metodę, wtedy są tymczasowo nieosiągalne
    • Zmienne należące do bloków np. if, for żyją tak długo aż ich blok się zakończy

Podstawy przypisywania zmiennych (Assignments)

  • Literały liczb całkowitych są automatycznie typu int
  • Wynikiem działania na liczbach całkowitych jest zawsze int nigdy nie jest to typ mniejszy od int'a
  • Zmiennoprzecinkowe liczby są domyślnie rozmiaru double 64-bits
  • Zwężanie typu prymitywnego obcina najważniejsze bity
  • Operatory typu (np +=, -=), zapewniają automatycznie rzutowanie.
  • Zmienne referencyjne trzymają bity, które są używane w odniesieniu do obiektu
  • Zmienne referencyjne mogą wskazywać na podklasy zdeklarowanego typu, ale nie do nad klasy
  • Kiedy tworzymy nowy obiekt np. JButton b = new JButton();, dzieją się trzy rzeczy:
    • Robi się referencja o nazwie b, typu JButton
    • Tworzy się nowy obiekt JButton
    • Zostaje przypisany obiekt JButton do zmiennej referencyjnej b

Używanie zmiennych lub elementów tablic, które są niezainicjowane i nieprzypisane

  • Kiedy tworzony jest nowy OBIEKT TABLICY, obiekty znajdujące się w tablicy nie są tworzone automatycznie, ale wszystkie referencje znajdujące się w tablicy dostają domyślną wartość czyli null
  • Kiedy tworzony jest obiekt tablicy zawierający typy prymitywne, elementy tablicy dostają wartości domyślne.
  • Zmienne klasowe są zawsze tworzone z domyślną wartością.
  • Zmienne lokalne zwane również automatycznymi, lub zmiennymi metody nigdy nie są inicjalizowane i nie dostają domyślnych wartości, jeżeli z próbujesz użyć takiej zmiennej przed jej zainicjowaniem dostaniesz błąd podczas kompilowania (compiler error)

Przekazywanie parametrów do metody

  • Metody mogą brać typy prymitywne i/lub referencje do obiektu jako argumenty
  • Argumenty metody są zawsze kopiami
  • Argumenty metody nigdy nie są aktualnym obiektem (mogą być referencją do obiektów)
  • Argument typu prymitywny jest niezałączoną kopia oryginalnej zmiennej typu prymitywnego
  • Argument typu referencyjnego jest następną kopią referencji wskazującą na oryginalny obiekt
  • Przykrywanie wstępuje wtedy gdy dwie zmienne z różnym zakresem (życia) dzielą tą sama nazwę. Utrudnia to wyszukiwanie błędów.

Deklaracja, konstrukcja i inicjalizacja tablic

  • Tablice mogą zawierać obiekty lub typy prymitywne, ale tablica sama w sobie zawsze jest osobnym obiektem
  • Kiedy deklarujemy tablice, nawiasy kwadratowe mogą być z prawej lub lewej strony nazwy
  • Nigdy nie można podawać rozmiaru tablicy podczas deklaracji np. int[6] i;, deklaracja znajduje się po lewej stronie znaku równa się
  • Musimy zadeklarować zawsze rozmiar wtedy kiedy tworzymy tablice (po new), chyba że tworzymy tablice anonimową
  • Obiekty znajdujące się w tablicy nie są tworzone automatycznie, chociaż dla typów prymitywnych znajdujących się w tablicy przypisana zostaje wartość domyślna
  • Dostaniemy NullPointerException jeśli spróbujemy użyć elementów tablicy, jeżeli te elementy nie wskazują na żaden konkretny obiekt
  • Tablice są indeksowane od zera
  • ArrayIndexOfBoundsException występuje jeżeli użyjemy złej wartości dla indeksu tablicy
  • Tablica ma zmienną lenght której wartość podaje liczbę elementów znajdujących się w tablicy
  • Indeks jest zawsze mniejszy o jeden od zmiennej lenght czyli wielkości tablicy
  • Tablice wielowymiarowe są to po prostu tablice w tablicach
  • Wymiar w wielowymiarowej tablicy może mieć różne długości
  • Tablica z zmiennymi prymitywnymi akceptuje każdą wartość która może być promowana bezpośrednio np. zmienna typu byte może być przechowywana w tablicy typu int
  • Tablice przechowująe obiekty, mogą przechowywać każdy obiekt który przeszedł test IS-A (instanceof). Np. jeżeli koń dziedziczy po zwierzętach, to koń może być przechowywany w tablicy typu zwierzęta
  • Jeżeli przypisujesz referencje tablicy do innej wcześniej zdeklarowanej referencji, to tablica która przypisujemy musi mieć ten sam wymiar (nie rozmiar) jak referencja do której ją przypisujemy.
  • Można przypisać tablice do wcześniej zdeklarowanej referencji tablicy jednej z nad klas. Np. Tablica typu Polonez może być przypisana do referencji tablicy typu Samochód zakładając oczywiście że Polonez jest podklasą Samochodu

Bloki Inicjalizujące

  • Statyczne bloki inicjalizujące wykonywane są tylko raz, kiedy klasa jest pierwszy raz ładowana
  • Bloki inicjalizujące zmienne klasowe uruchamiane są za każdym razem kiedy tworzymy nową instancje klasy, zostają wykonane zawsze po wszystkich super-konstruktorach ale przed konstruktorem klasy w której znajduje się dany blok
  • Jeżeli w klasie istnieje wiele bloków inicializujących zachowują one zasady wymienione wyżej i zostają wykonywane w takiej samej kolejności w jakiej znajdują się w pliku źródłowym

Opakowywanie (Wrappers)

  • Klasy opakowujące wiążą wzajemnie zmienne typu prymitywnego
  • Klasy opakowujące mają dwie główne funkcje:
    • owinąć typ prymitywny tak żeby można było go traktować jak obiekt
    • Zapewnić metody dla typów prymitywnych, głównie konwersja
  • Trzy najważniejsze metody to:
    • xxxValue() - nie bierze żadnych argumentów zwraca typ prymitywny
    • parseXxx() - pobiera String'a zwraca typ prymitywny, rzuca wyjątek NumberFormatException
    • valueOf() - przyjmuje String'a zwraca obiekt opakowując, rzuca wyjątkiem NumberFormatException
  • Konstruktor klas opakowujących może wsiąść String'a lub typ prymitywny, z wyjątkiem Character, który może pobrać tylko char
  • Radix - odnosi się do bazy zazwyczaj różnej niż 10; octal radix to 8, hex radix to 16

Boxing

  • Od Javy 5, boxing pozwala nam na konwersję typu prymitywnego do obiektu opakowującego lub konwersję obiektu opakowującego do typu prymitywnego automatycznie
  • Przy porównywaniu wartości używając operatora == będzie działało dla małych wartości dokładnie dla przedziału byte czyli mniejsze od 127 większe od -128, większe wartości nie będą równe przy sprawdzaniu za pomocą tego operatora ==

Zaawansowane przeciążanie

  • Metody wybierają najmniejszy typ prymitywny jaki tylko jest możliwy
  • Używanie osobno, boxowania i metody var-args są kompatybilne z przeciążaniem
  • Niemożna rozszerzać z jednego obiektu opakowującego do innego nie przejdzie testu IS-A
  • Niemożna rozszerzać i następnie boxować. int nie może się stać Long
  • Można boxować a następnie rozszerzać. int może stać się Object, przez Integer
  • Można łączyć var-args bądź z rozszerzaniem lub boxingiem

Garbage Collection (GC)

  • W Javie GC zapewnia automatyczne monitorowanie pamięci
  • Celem GC jest usuwanie obiektów które nie są już osiągalne
  • Tylko JVM decyduje kiedy uruchomić GC, możemy tylko zasugerować uruchomienie jego
  • Nie znamy algorytmu działania GC
  • Obiekt musi zostać uznany za nadający się do usunięcia zanim zostanie zniszczony
  • Obiekt się kwalifikuje do usunięcia kiedy żaden wątek nie może do niego dotrzeć
  • Aby dotrzeć do obiektu, musimy posiadać aktualną referencję do tego obiektu
  • Aplikacją Javy może zabraknąć pamięci
  • Można żądać GC za pomocą System.gc(); tylko przed SCJP 6
  • Klasa Object posiada metodę finalize()
  • Metoda finalize()
  • Metoda ta gwarantuje że zostanie uruchomiona raz i tylko raz na danym obiekcie za nim zostanie on usunięty, ale nie oznacza to że musi ona będzie wywołana
  • GC nie gwarantuje, że metoda finalize() może być kiedykolwiek wywołana
  1. class Main {  
  2.     public static void main(String[] aa){  
  3.          Mian m = new Main();  
  4.   // nie można tak rozszerzać integera do longa  
  5.   // dla testu IS-A bylo by Integer IS-A Long = false  
  6.          m.test(new Integer(5))  
  7.     }  
  8.     void test(Long x){ }  
  9. }  

SCJP 6 exam


stat4u stat4u

Brak komentarzy:

Prześlij komentarz

Powered By Blogger