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 boolean są true 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
class Main {
publicstaticvoid main(String[] aa){
Mian m = new Main();
// nie można tak rozszerzać integera do longa
// dla testu IS-A bylo by Integer IS-A Long = false
m.test(new Integer(5))
}
void test(Long x){ }
}
class Main {
public static void main(String[] aa){
Mian m = new Main();
// nie można tak rozszerzać integera do longa
// dla testu IS-A bylo by Integer IS-A Long = false
m.test(new Integer(5))
}
void test(Long x){ }
}
Brak komentarzy:
Prześlij komentarz