25 lut 2010

Protected access


public class Parent {
protected int i=14;
}

public class Child extends Parent {

@Test
public void testProtectedAcess(){
prn(i); // z superClass => OK działa

Parent parent = new Parent();

//zadziałała jak 2 klasy sa w tym samym pakiecie!
prn(parent.i);


}
}



  • Trzeba się bacznie przypatrzeć!!

TODO

  1. Przysłanianie metod, które są prywatne w klasie bazowej
  2. Kiedy obiekty są dostępne dla GC! {scope ,wyjście z metod, różne!!!}

Interfejs

  1. W pliku java może być kilka interfejsów!
  2. Interfejs bez moted może być!
  3. metody interfejsu nie mposiadają ciała!
  4. Każda  metoda interfejsu musi być implementowana w klasie implementującej!
  5. uwaga! Klasa abstrakcyjna może posiadać abstrakcjyjne jak i nie abstrakcyjne metody! 
  6. Metoda int ok(); jest widziana jako public abstract ok()
  7.  Interfejs może zawierać zmienne ,które są public, static final ( consts) !!
  8. Nie może posiadać metod statycznych!
  9. Nie może być oznaczony  jako final, strictfp lub native!!
  10. Interfejs może extend  tylko  jedną lub kilka interfejsów!!
  11. Interfejs nie może immplement czegoś!!
  12. Każda metoda w interfejsie jest public i abstract!




//private interface Bouncable {} nie może być private
//protected interface Bouncable {} // nie wolno
abstract interface Bouncable2{};
//public abstract interface dsd{} nie ładzia
public interface Bouncable{

//test zmiennych
int ok=1; //widziana jako public static final !!!!!!!!!!!!!!!
//!int ok2; //musi być zainicjalozowana ( bo stała!!)

//!protected int ok=2; nie wolno

final int ok2=9; //ok
static int ok3=12; //ok
public int ok4=99; //ok

public abstract int ok(); //działa
int ok2(); //UWAGA!! i tak jest widziana jako public abstract!!

//!int ok3(){}; metody interfejsu nie mposiadają ciała!

//test static
//! static int metodaStatyczna(); nie może być STATIC!!

//test final
//!final void doSth(); niedozwolone
//!private void doSth(); niedozwolone

}

Pytania

  1. Czy klasa abstrakcyjna może imlementować interfejs?
  2. Klasa dziedzicząca z klasy abstrakcyjnej musi dziedziczyć wszytkie metody abstrakcyjne?
  3. Czy się to skompiluje? final abstract class{}
  4. Czy klasa abstrakcyjna musi mieć jakąkolwiek motedę lub zmienną ?

Klasa abstrakcyjna


abstract class Car{

private double price;//ok
private final int x=5;//ok

private static int $=9; //ok

private static final int _=9; //ok

/*variable cannot be abstract*/
//public abstract int i;

/* klasa abstrakcyjna nie ma ciała!*/
// public abstract int getInt(){};

public abstract int getInt(); //ok

/*niedozwolona kombinacja*/
//!private abstract int getIntPriv(); //ok

protected abstract int getIntPriv(); //ok
abstract int getInt2(); //ok


public int normalMethodWithBody(){ //ok

byte b=9; //ok
b=b++; //ok szok!!
return b; //autmoatyczna promocja typów na szerszy :D
}

}



  • Jeżeli klasa posiada choć 1 metodę abstract to cała klasa musi być abstract!
    >


  • Klasa dziedzicząca z klasy abstrakcyjnej musi dziedziczyć wszytkie metody abstrakcyjne!



Inkrementacja byte


byte x=7;
b++; //ok
b=b++;//ok
b=(b+10); // promocja b+10 na inta , trzeba cast
b=(byte)(b+10); // ok


Co się stanie po b++ ?