1. Java ismétlés

A VIK Wikiből

1.1. osztályok, interfészek

Virtuális függvények

  • Minden függvény virtuális
  • Leszármazottban függvény felüldefiniálás esetén mindig a dinamikus (leszármazott) típus szerinti függvény hívódik meg:
class A {
	 public void foo() { System.out.println("A"); }
	 public void bar() { foo(); }
}
class B extends A {
	 public void foo() { System.out.println("B"); }
}
...
A a1 = new A(); // statikus tipus A, din. tip. A
A a2 = new B(); // statikus tipus A, din. tip. B
a1.foo(); // "A"
a2.foo(); // "B"
a1.bar(); // "A"
a2.bar(); // "B"

Object ősosztály

  • Szinte minden típusnak ő az őse, kivéve az alaptípusok (int, float, double, stb.)
  • boolean equals(Object o) - tartalom alapú összehasonlítás
  • == - cím szerinti összehasonlítás (kivéve a primitív típusoknál mint amilyen az int is; boxing!)
  • int hashCode() - hash kulcs generálása (pl. hash-táblák használata esetén szükséges)
  • Object clone() - lemásolja az objektumot (deep/shallow copy)
  • void finalize() - Garbage Collector által hívott "destruktor", erőforrások felszabadítására
  • wait(), notify(), notifyAll() - szálak bevárása, felébresztés
  • Class getClass() - reflection elkérése

Boxing

  • ~: Alaptípusok (int, float, double, stb.) becsomagolása objektumba
  • Integer osztályban -128 < x <=127 tartományban automatikusa, beépített módon, különben elő kell állítani
new Integer(3) == new Integer(3)
new Integer(300) != new Integer(300)

Interfész

1.1. Belső osztályok

  • elérik a tartalmazó osztálypéldány változóit
  • tagosztály: (akár) elérhető kívülről
  • lokális osztály: blokkon belül
  • anonim osztály:
addWindowListener(new WindowListener() {
	public void windowClosing(WindowEvent e) {
	System.ext(0);}
});

1.2. Memóriakezelés

  • Beépített Garbage Collector
  • Törléskor finalize() meghívódik
  • Egymásra hivatkozásokat, köröket felismeri
  • Manuálisan is hívható:
System.gc();
Runtime.gc();

1.3. Szálkezelés

Thread (osztály)

  • állapotátmenetek
    • run() - futtatandó kód
    • start() - szál indítása
    • yield() - lemondás a futásról
    • sleep() - várakozás
    • interrupt() - várakozás megszakítása
    • join() - futás megszakítása
  • tulajdonságok:
    • getId() - azonosító
    • get/setName() - név
    • get/setPriority() - prioritás
    • isAlive() - fut-e
    • isDaemon() - daemon-ként fut-e

Runnable interfész

  • run()

Kölcsönös kizárás

  • objektumonként monitor + várakozási sor
Hashtable<String, Integer> ht = ...;
public void increment(String s) {
	synchronized (ht) {
		int i = ht.get(s);
		i++;
		ht.put(s,i);
}}
  • synchronized: blokk vagy metódus előtt

volatile

  • biztosítja, hogy az értékadás/lekérdezés atomi művelet legyen
  • long és double pl 64 bitesek, több szálnál ezeknek volatile-oknak kell lenniük, különben hazárdos lehet az értéke (JVM 32 bittel dolgozik)

szinkronizálás (Object osztály metódusai)

  • wait([timeout]) várakozási sorba kerül
  • notify() egyet felébreszt
  • notifyAll() összeset felébreszti

1.3. Genericitás

  • <E> - E típusú
  • <?> - konvertálható bármivé, így <Object>-vé is, viszont visszafele nem megy
  • <? extends E> - ?, ami a E-ből származik
  • <? super E> - ?, ami E ősosztálya

1.4. Kollekciók

Collection<E> (általánosan)

  • add(E e), addAll(Collection<? extends E> c)
  • remove(E e), removeAll(Col<? ext E> c)
  • contains(E e), containsAll(Col<? ext E> c)
  • size(), isEmpty()
  • clear(), retainAll(Col<? ext E> c)
  • equals(E e)
  • Object[] toArray(), <T> T[] toArray(T[] ta), Iterator<E> iterator()

Iterator

  • hasNext(), next(), remove()
  • Set, SortedSet, List, ListIterator, Queue, Map
ciklusCollection<Integer> c = ...;
for (Integer i : c) {
	System.out.println(i);
}

Szemafor pszeudokód

Init(Semaphore s, Integer v){
		s := v;
}
P(Semaphore s) { // Acquire Resource
		wait until s > 0;
		then s := s-1;
		/* must be atomic once s > 0 is detected */
}
V(Semaphore s) { // Release Resource
		s := s+1; /* must be atomic */
}

--+++ Szemafor JAVA


public class Semaphore{
	private int s;
	public Semaphore(int v) {
		s = v;
	}

	synchronized public void P()
			 throws InterruptedException {
				 while (s <= 0) {wait();}
				 s--;
	}
	
	synchronized public void V() {
		s++;
		notify();
	}
}

-- Maestro - 2012.01.02.

-- MeszegetoBalazsIstvan - 2008.05.27.

-- Velias - 2009.05.26.