Static class

- Can have both static and non-static methods
- In regular non-static classes, a static method can’t call non-static method (example: can’t call non static method form main method).
-można wywołac metode statyczną z nie statycznej, nie można wywołac statycznej z nie statycznej.

-można z jednej klasy statycznej wolac metody statyczne innej klasy statycznej

Overload vs Override vs Hide

Overload principles:

- the method name must remain the same
- any access modifier is accapted, but just changing it is not enough for legal overloading
- any exception is accepted but changing it is not enough
- return type must be the same, changing it breaks oveloading and compilation fail due to ‘Duplicate method’
- with 2 method implementations: in subclass and in superclass, different return type is allowed (Super->Sub)
- in same one class: not allowed, changing return type super->sub
-
- return types: primitive type and wrapper object are not enough to overload but in properly overloaded method
- w przeladowanej na przestrzeni dwoch klas metodzie suber/sub w returnie jest ok

public abstract class Main {

public Main operate() {
return null;
}
}
class Klaska extends Main{
public Klaska operate(int i) {
return null;
}
}

Override principles:

- return type the same or subtype
- access modifier wider
- exception the same or subtype
- same name and sygnature

Hide principles:
- apply only to static methods
- are not polymorphic, you always call the reference type method
- should not be called on instances

test killer

review
001 – pola interfejsu: public,static final
002 – dynamiczna lista argumentów jest traktowana jak tablica
003 – boolean b1 = true;
boolean b2 = false;//wykona sie tez dla true. Jesli zmienimy b2==true, wtedy tylko dla true
if((b2=true)&&b1){
System.out.println(3);
}
004 – finally działa nawet jeśli nie tylko w try ale też w catch pojawi się wyjątek
005 – ClassCastException kiedy mówimy ze Parent jest Dzieckiem: x = (Dziecko)parent
znaczenie ma to co jest po prawej stronie w nawiasach. W typie referencji po lewej może być dowolny
supertyp, ten sam typ albo subtyp na który próbujemy rzutować.
006 – Locale ma trzy metody tworzenia:

Locale l = Locale.getDefault();
System.out.println(l.getDisplayCountry()); //Polska
System.out.println(l.getCountry()); //PL
System.out.println(l.getDisplayLanguage());//polski
System.out.println(l.getLanguage()); //pl
new Locale(String language)
new Locale(String language,String country)

DateFormat df = DateFormat.getInstance();
.getTimeInstance(); .getTimeInstance(int style); .getTimeInstance(int style,Locale l);
.getDateInstance(); .getDateInstance(int style); .getDateInstance(int style,Locale l);
.getDateTimeInstance(); .getDateTimeInstance(int style);.getDateTimeInstance(int style,Locale l);
007 – enkapsulacja:pola prywatne,ustawiane przez set/get; propertisy
008 – nie można używać private fielda parenta, ani bezpośrednio ani przez super.
009 – has-a pole może być prywatne
010 – jeśli klucz nie nadpisuje hashCode i equals można dodać takich obektów dużo do HashMapy
nie można jednak usunać, remove do którego przekazujemy tak sam klucz jak przy dodawaniu nie znjadzie
elementu który chcemy usunąć a wszystkich też nie usuwa. Klucz jesli jest custom obiektem zeby byc kluczem
w kolekcji musi nadpoisać equals i hashcode, wtedy uwuwamy podając unikalną instancję na postawie pól.
Nie dodamy dwa razy takiego samego klucza, usuwa wczesniejszy, zachowuje ostatni.
Operacja add(E e); interfejsu Set zwraca boolean – jesli element już był w kolekcji nie dodaje
go i zwraca false.
011 – sortowanie tablicy różnych typów (String,Integer,Boolean) powoduje ClassCastException
wraper Byte przyjmuje byte albo String: new Byte((byte) 787); trzeba rzutować argument
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Byte
nie można rzutować pierwszego elementu listy na pierwszy innego typu
012 – int x = 0;
int y = 0;
System.out.println(“x: “+ x++); //0
System.out.println(“y: “+ ++y); //1
013 – można statycznie zimportować pole,metode, statyczna nested class
014 – jesli enum jest w klasie, to z innej klasy notacja: Klasa.Enum ke = Klasa.Enum.WARTOSC;
015 –

020 – System.out.println() wywołuje na obiekcie toString();
021 – abstrakt w typie referencji
022 – metoda zwykla moze wołać abstrakcyjną w tej samej klasie abstrakcyjnej
023 – najpierw extends potem implements
jeśli interface i klasa abstrakcyjna mają tę samą metodę (abstrakcyjną) wówczas implementuje sie ją tylko raz
024 – klasa abstrakcyjna rozszerza inna abstrakcyjna i nie musi implemetowac jej abstrakcyjnych metod
025 – klasa abstrakcyjna moze implementować interfejsy
nie ma konstrukcji: implements A, implements B, jest implements A,B
026 – jeśli klasa implementuje interface który zaimplementował juz parent, wówczas sama nie musi implementować, użyje implementacji parenta
027 – zmienna zdefiniowana w try nie jest widoczna w catch i finally
zmienna zdefiniowana przed try musi byc zainicjalizowana zeby mozna bylo jej uzyc w catch i finally
028 – int x = 5 x+=x sysout x= 10
029 – do jednej tablicy można przypisać inna: int[]x = {1,2} int[]y = x; y ma te same elementy co x
030 – # nie może być na początku zmiennej, ~ nie może być wogóle, $ moze być _ tez
031 – taka konstrukcja nie przejdzie: int[]a = new int[3]{1,2,3};
może być jednak coś takiego: static final int[]a;
static {a=new int[2]; a[0]=100;a[1]=101}
taka deklaracj ajest ok: int[]a = new int[]{1,2,3}; (brak podanej wielkości tablicy)
032 – iteracje po enumie: for(Color c : Color.values())
033 – wartośc enuma np KOLOR(233) uzyskujemy definiując pole, jego wartosc powinna być ustawiana przez konstruktor a pobierana getem
wtedy można getem pobrać ten numer
ordinal to index enuma, zaczyna sie od 0
034 –
035 – Object o = new int[]{1,2,3};
int[]tab = (int[]) o;
036 – metoda niestatyczne moze wołać statyczną
037 – zmienna liczba argumentów (String…s
038 – JavaBeans naming standard: camelCase
039 – metoda statyczna nie moze wołać pola nie statycznego
040 – getter dla boolean może być isCosTam zamiast getCosTam
041 – submetoda może zwrócić ten sam typ lub subtyp
042 – override modyfikatory: taki sam lub szerszy
043 – override nie moze zwrocic supertypu
044 – jesli sa dwie metody metoda1(int a,int b) oraz metoda1(int…x) i wywołamy z 2 argumentami odpali sie ta pierwsza, bardziej konkretna
045 – return type to nie overload
046 – klasa statyczna Outer.Static = new Outer.Static();
047 – zobacz lepiej przykład
048 – konstruktory wykonuja sie od konca
049 – dwa konstruktory argumentowe Sub i Super, sub musi jawie wywołać super(argument), mimo ze oba sie mapuja
050 –
051 – konstruktory w jednej klasie wykonuja się tak jak
w przypadku dziedziczenia, od najwyższego
052 – w switchu default musi być na końcu i jest sam, tzn nie ma case: default – jest samo default
053 – nie musi być default w switchu
054 – Boolean.valueOf(“True”)
055 – wrapery można dodawać new Integer(2)+new Integer(3)
056 – długośc String to length()
po else nie może być else, jedynie else if
057 – if else nie ma finally
058 – zobacz
059 – jesli warunek while nie jest spełniony, petl a nie wykona sie
060 – do while moze wykonywac sie w nieskonczonośc jesli warunek jest spelniony. Nawet jesli wyjściowo warunek jest niespełniony, pierwsza iteracja która zawsze jadzie moze go zmienić na true
061 – interfejs Collection ma metode iterator() która zwraca instancję Iterator
Po instancji Iteratora nie można iterować. Można iterować po tablicy i instancji Iterable
062 – Collection może być w typie referencji, możemy po tym iterowac
063 – i w pętli for nie jest dostępny za pętlą
064 – AssertionError nie AssertionException
065 – AssertionError nie AssertionException
066 – słowo kluczowe assert jako nazwa zmiennej wymaga: javac -source 1.3 wtedy compilation succedes with warnings
067 – default: assert false; – to jest ok, do sprawdzenia w wersji drukowanej, można zrobić assert na metodzie która zwraca boolean assert (stuff4()); assert nie może sprawdzać argumentów publicznych metod
068 – override metoda nie może rzucac Exce jesli metoda parenta nie rzucała
069 – klasa która extends Exception jest checkedException, trzeba łapac albo rzucic dalej
070 – finally zawsze
071 – override nie może rzucać checked exce jesli parent nie rzucał
072 – override może rzucic Runtimeexception nawet jesli parent nie rzucał
po: throw new Exception() nic więcej się nie wykona (jak return)
class B extends A ((A)new B()).process(); – wywoła sie metoda z B
jeśli rzucamy na parenta (upcast): B b = (A)new B(); jest compil error
w typie referencji musi być parent: A b = (A)new B(); – i tak jest wołana metoda z B
073 – metody statycznie nie działają polimorfcznie. Jeśli same klasy są polimorficzne a metody nie, polimorfizm działa normalnie. Jeśli metoda parenta rzuca wyjątek checked a wołamy polimorficznie metode childa A b = new B(); (która nie rzuca) b.metoda() – wykona sie polimorficznie metoda childa nie parenta, ale i tak wtwołanie musi obsłuzyć wyjątek

074 – child nie musi rzucać exception jesli parent rzucał
075 – po rzuceniu wyjątku rzeszzta tego co jest w try sie nie wykona
076 – do analizy
077 – do analizy
078 – łapanie wyjątkow musi mieć odpowiednią kolejność,najpierw najbardziej specyficzne
jeśli najpierw złapiemy Exception następne catch z bardziej konkretnym wyjątkiem da compilation error
079 – jesli metoda rzuca Error a my łapiemy wyjątek, metoda która woła metode rzucającą sama rzuci Throwable
080 – jesli nie ma catch, wyjatek nie jest łapany i wraca do metody która wywołała metoda rzucajaca
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100

Thread & Runnable

Nadpisanie metody run() w Thread powoduje, że ta nadpisana metoda zostaje wywołana zamiast run() z Runnable.
Nawet jesli run() jest w Thread i Runnable i runnable jest przekazany do thread, wywolanie run() albo start() uruchamia
run z Thread nie Runnable. Zeby uruchomił się run() z Runnable, w Thread nie moze byc run().