public class Base {
public static String _static="base_static";
public String _inst="base_inst";
public String publicMethod(){
return "base_public_method";
}
private String privateMethod(){
return "base_public_method";
}
}
public class Subclass extends Base{
public static String _static="subclass_static";
public String _inst="subclass_inst";
public String publicMethod(){
return "subclasss_public_method";
}
}
@Test
public void testprzyslaniania(){
Base base = new Base();
prn(base._inst); //base_inst
prn(base._static);//base_static
prn(base.publicMethod());//base_public_method
Subclass sub = new Subclass();
prn(sub._inst);//subclass_inst
prn(sub._static);//subclass_static
prn(sub.publicMethod());//subclasss_public_method
Base base_ref= sub;
prn(base_ref._inst);//base_inst
prn(base_ref._static);//base_static
prn(base_ref.publicMethod());//subclasss_public_method
Base base_base_cast=(Base)sub;
prn(base_base_cast._inst);//base_inst
prn(base_base_cast._static);//base_static
prn(base_base_cast.publicMethod());//subclasss_public_method
/**
* Wnioski:
* + dynamicznie (po typie obiektu) są tlko metody
* + zmienne static / inst = są wybierane po typie referencji!
*/
}
27 lut 2010
Polimoryzm
Extend - przykłady
Poniższe jest ok
interface Driver{}
interface Drivere extends Driver{}
abstract class AbsClass implements Driver{}
class FirstConcreteclass extends AbsClass implements Driver{}
abstract class SecoundABstratClass extends FirstConcreteclass{}
Java nie sprawdza ,ze podwórnie klasa FirstConcreteclass implementuje Driver
i klasa bastrakcyjna może rozszerzać nie abstrakcyjną,
Enum
public enum ERozmiar {
DUZY(100), SREDNI(10),
MALY(1) {
@Override
public String getStringReprezent() {
return "IAmMaly!!";
}
};
/**
* Wymagany jest konstruktor z intem
* nie może być public!!!
* wejdzie gdy Erozmiar roaz= Erozmia.DUZY
*/
ERozmiar(int wybrany) {
this.wybrany = wybrany;
}
private int wybrany;
public int getWybrany() {
return wybrany;
}
public String getStringReprezent() {
return "otherThanMALY";
}
}
public class ConcreteClass {
/**
* maly,sredni,wielki są pub;ic staic final!!!!!
*/
enum Rozmiary{ maly, SREDNI, WIELKI}
@Test
public void extendEnumTest(){
ERozmiar rozDuzy =ERozmiar.DUZY;
prn(rozDuzy.getStringReprezent());
ERozmiar rozMaly =ERozmiar.MALY;
prn(rozMaly.getStringReprezent());
//results:
//otherThanMALY
//IAmMaly!!
}
- Niem oże być deklarowany lokalnie! ( w metodzie)
- Wewnątrz klasy i owszem.!!!!!!!
- Moga być deklarowane w osobnym pliku!
- Dekalracja enuma poza klasą nie może być protected lub private!
- Dekalracja enuma poza klasą może być default lub public!
- Na końcu nie musi być średnika :D
- Enum może mieć metody , zmienne swoje , konctruktor z intem!!
- Jeżeli wydrukujemy to bedzie domyślenie drukowana anzwa enum np MALY
- Kązdy enum ma static funkcje values , która zwraca tablicę elemtów enuma w kolejności.
- Nie możesz wywołać konstruktora enuma bezpośrednio!!!
- Element elumu może nadpisywać metody w tym enumie!!
Zmienne final
- Raz zainicjalozowane nie mogą być zmieniane
- Jeśli chodzi o ptymitywy to chodzi o vartość
- Jeśli chodzi o Obiekt to nie wolno zmieniać referencji, zaś samo obiekt może być modyfikowany!.
- Nie ma final obiektów, tylko final referencje!
- Co do final klas- nie mogą być subklasowane
- Co do final metod - nie mogą być overriden!
public class ConcreteClass {
final int x;
public ConcreteClass() {
x=10;
//x=12; 2 raz nie wolno
}
@Test
public void finalTest() {
// x=12; tylko w KONSTRUKTORZE!
final int x_inside_method;
x_inside_method=9;
// x_inside_method++; nie wolno!! be be
}
Deklarowanie tablic
@Test
public void testTablicy(){
//all correct
int[] x;
int y[];
String[][] strinTab;
String [] stringTable[];
}
- Przy deklaracji nie używamy rozmiarów ( np int[5] tablica).
Zmienne lokalne
- Nazywane takrze automatyczne,
- Zmienne nie tylko są inicjalozowane ale także deklarowane wew. metody
- Są niszczone kiedy wyjdziemy z metody!
- Są na stosie
- Jeżeli zmienną bedzie obiekt to i tak bedzie on na stercie!
- Nie ma czegoś takiego jak obiekt lokalny , jest to tylko lokalna referencja do obiktu na stercie.
- trzebą ją zasinicjalozować!!!! ( przed użyciem)
- Może mieć taką samą nazwę jak zmienna instancji ( także static).
Porównanie modyfikatorów
- Zmienne lokalne : final
- Zmienne ( nie lokalne) : final, public, protected, private ,static, transient volatile
- Metody: final, public, protected, private ,static, abstract, synchronized, strictpf, native
- Klasa: hm... public, default, strictfp, abstract...( dodać)
Zmienne instancji
- Można wykorzystać 4 aces modifiers
- Może być final
- Może być transient
- Nie może być: synchronized,abstract, native, strictfp,
- Nie może być static, bo wtedy staje sie zmienną klasy
char- przytowanie
public void absMethod() {
char c =65000; // dodatnie 0-65535
short s = 6500;
c=s; //zonk : possible lost , chodzi o ujemne!
s=c; //jak wyżej
byte b=0;
s=b; //ok
c=b; //possible lost a presicion bo ujemne!!
}
Kwestia ustraty znaku!, Char ma tylko dodatnie!
Spis ważnych
- Dostępność memberów -SCJP book , page 39
- Gdy metoda w base throw Exception - SCJHP book,page 108
- hashcode a equals , SCJP book, page 554
Podstawy cz.2
- Do protected nie odnosimy się przez .
- Dla klas w innych pakietach do protected członków można dostać się tylko
przez dziedziczenie - Do protected member dostaniemy się z klasy z tego samoego pakietu!!!
- Zmienne lokalne są bez modyfikatorów dostępu
- W zmiennych lokalnych można uzywać final
- Protected= package + subclass throught inheritance
- Klasa nie bastrakcyjna z choć 1 metodą abstract jest illegal!!
- Klasa abstrakcyjna nie musi mieć abstrakcyjnych metod!.
- Pierwsza nie abstrakcyjna klasa musi implementować wszystkie metody abstrakcyjne z superclass.
- static + abstract method are illegal!
- Oznaczenie synchronized stodujemy tylko do metod i bloków kodu!
- Native tylko dla metod! ( deklaracja jak metody anstrakcyjne)
- strictfp tylko dla klas i metod ( nie dla zmiennych!!!! )
- Varargs: void method(int... x) {}
- Varargs musi być ostatnim marametrem!
- Varargs=> 0 lub wiele
- Jeżeli przed konstruktorem damy void to jest traktowany jako metoda.
- Konstruktor nie może być ani final ani static ani abstract!
- Ile zajmuje boolean to zależy od sprzętu!.
- Char i short zajmują 16 bitów.
- Klasy abstrakcyjne mogą implemntować interfejsy!
- Metod ,które są w interfejsie nie trzeba zapisywać w klasie abstrakcuyjnej, dopiero w pierwszej klasie konkretnej!!!
- volatile tylko do zmiennych!
- Jeżeli klasa nie jest public to nazwa nie musi pasować do nazwy pliku!!!
- Metoda private nie może być overriden!!
- throws jest dozwolone po sygnaturze metody abstrakcyjnej!!
- może być synchronized łączone z final i modyfikatorami dostępu.
- Klasa abstrakcyjna może rozszerzać klasę konkretną!!
Subskrybuj:
Posty (Atom)