• byte to short, int, long, float, or double
• short to int, long, float, or double
• char to int, long, float, or double
• int to long, float, or double
• long to float or double
• float to double
6 mar 2010
Promocja typów - rozszerzająca
1 mar 2010
Haczyki
Metoda o identycznej nazwie jak konstruktor ( np z void)- Return char gdy metoda zwraca inta -> ok dozwolone
- Zwracanie null kiedy powinniśmy zwracać prymitywa.
- Do tablicy prowadzi referencja.
- Jeżeli stworzyłeś konstruktor z argumentami to już nie ma tego domyślnego bez argumentów
- Czy klasa abstrakcyjna ma konstruktor? -> Tak!
- Czy interfejs ma konstrutor? -Nie!
- Domyślny konstruktor ma taki sam access mod jak klasa!
- W konstruktorze nei może być jednocześnie this(..) i super(..)
- Metody static nie sa overriden lecz tylko po typie referencji!!
- instanceof tylko dla rferencji i klasy z tego samego drzewa dziedziczenia !
- long is illegal in switch statement!
- null isntance of [jakakolwiek kalsa] => false !! ( także pośrednio)
- [Dog object] instance of Cat => compilation error!
- argument byte not passing to method(Long)
- int x => wybierze Object x niż Integer... (var-arg)
- List nie możesz dodać Dog or Cat !!
- List poprawne!!
- List oznacza każdy rodzaj Listy!!!
//haczyki
String[] czyDozwolonyNull(){ return null; } //ok
int[] czyDozwolonyNullDlaPrymiTywa(){ return null; } //ok
}
abstract class CzykonstruktorMa {
public CzykonstruktorMa() {
}
}
class Konkret{
int dupeczka;
public Konkret() { }
/*To jest metoda a nie konstruktor!!!*/
public void Konkret(){}
public Konkret(int dupeczka) {
Konkret(); //metoda e nie konstruktor
this.dupeczka = dupeczka;
}
}
class Base{
int x; int y;
public Base(int x, int y) {
this.x = x; this.y = y;
}
}
//!class Extended extends Base{ } zonk bo
//nie ma domyślnego konstruktora
/*Teraz jest ok*/
class Extended extends Base{
public Extended(int x, int y) {
super(x, y);
}
}
Poliporfizm
Tylko metody sąwywoływane dynamicznie ( po typie obiektu na który wskazuje referencja)- Zmienne static i nonstatic nie są dynamicznie wybierane, wybieran są ząś po typie referencji!!
- Overloading nie po typie referencji!!
- Przy oveloading można dowolnie zmieniać modyfikator dostępu jak i zwracaną wartość.
instanceof
@Test
public void testInstanceOf() {
//assertTrue(null instanceof Object); false
//assertTrue(null instanceof String); false
//!!assertTrue(int instanceof Object); compilation Error
//@assertTrue(String instanceof Object); błąd kompilacji
//primitives
int x = 6;
//assertTrue(x instanceof Object); zonk :)
/**
* Wnioske:
* referencja instanceof Klasa
*/
int[] tab ={1,2,3};
assertTrue(tab instanceof Object); //ok
}
Pisane tylko małymi literami- Zasada: po lewej stronie referencja
- Zasada: po proawej stronie Klasa Name
28 lut 2010
Zasady overriding
- Lista argumentów musi dokładnie pasować. ( ?)
- Taki sam zwracany typ lub subtyp!
- Modyfikator dostępu nie może być bardziej restrykcyjny!
- Modyfikator dostępu może być mniej restrykcyjny.
- jeżeli klasy base i subclass są w tym samym pakiecie to można override metody nie oznaczone private lub final.
- Jeżeli klasy base i subclass są w różnych pakietach to można override metody nie oznaczone final i oznaczone public lub protected!
- Metoda nadpisująca może rzucać unchecked(runtime) wyjątkiem,jakimkolwiek.
- metoda nadpisująca nie może rzucać wyjątkiem(checked) zupełnie nowym lub bardziej ogólnym od metody nadpisywanej!
- metoda nadpisująca może rzucać wyjątkami mniej ogólnymi lub liczbebnością mniej
- metoda nadpisująca nie musi throw jakiekokolwiek wyjątku!
- Nie możeż nadpisywać metod finalnych.
- Nie możesz nadpiywać metod static!
- Jeżeli metoda nie może nie być dziedziczona to nie może być nadpisywana (np private method in base class)
public class Base {
public void publicMethodInBase(){}
public void methodWithException() throws Exception{}
public void methodWithManyExceptions()throws IOException,NotSerializableException{}
public int intReturnMethod(){return 1;}
public void intArgMethod(int x){};
}
public class Subclass extends Base{
/*Bardziej restrykcyjny mod dostępu !*/
//!protected void publicMethodInBase(){}
@Override /*Ob bo wężwzy exception*/
public void methodWithException() throws IOException{}
/*Jest wiecej wyjątków ale węższe od Exception*/
public void methodWithException() throws IOException,NotSerializableException{}
public void methodWithException() {} //ok, bo mniej wyjątków
/*Zonk bo szerszy exception!!*/
//!public void methodWithManyExceptions()throws Exception{}
//!public long intReturnMethod(){return 1;} //zonk bo inny return!
/*To nie overriding lecz overloading!*/
public void intArgMethod(long x){};
}
27 lut 2010
Polimoryzm
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!
*/
}
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ą,
Subskrybuj:
Posty (Atom)