
/**
 * Eine Klasse mit Beispiel-Laufzeit-Betrachtungen der JVM
 * 
 * @author Jan Bernitt
 *
 * @version 1.0
 */
public abstract class Example {

	/*
	 * IV. 3 Erzeugen von Klassen-Instanzen
	 */
	
	public void createInstance() {
		new String("No hay banda! There is no band. It is all an illusion... ");
	}
	
	/*
	 * IV. 4 Lesen und Schreiben von Feldern
	 */
	public final static int ANSWER = 42;
	private int question;
	
	public void getAndPutFields() {
		this.question = Example.ANSWER;
	}
	
	/*
	 * IV. 5 Konstanten
	 */
	public void accessConstants() {
		int i = 1;
		i += 100;
		i *= 10;
		i *= 300;
		float f = 1.0f;
		f += 100.0f;
		double d = 1.0;
		d += 100.0d;
	}
	
	/*
	 * IV. 6 Methodenaufruf und Rückgabe
	 */
	
	public void invokeStatic() {
		Example.mul(6, 7);
	}
	public static int mul(int i1, int i2) {
		return i1 * i2;
	}
	
	public void invokePrivate() {
		this.sum(19.5f, 22.5f);
	}
	private float sum(float left, float right) {
		return left + right;
	}
	
	public void invokePublic() {
		sub(2048, 2006);
	}
	public int sub(int i1, int i2) {
		return i1 - i2;
	}
	
	public int invokeInterface(IExample obj) {
		return obj.doSomething(42);
	}
	
	/*
	 * IV. 7 Auslösen, Kontrolltransfer und Fangen von Exceptions
	 */
	
	public final class Exc1 extends Exception {
		private static final long serialVersionUID = 2249636606521775937L; }
	public final class Exc2 extends Exception {
		private static final long serialVersionUID = 3142536860880421162L; }
	
	void nestedCatch() {
		try {
			try {
				tryThis();
			} catch (Exc1 e) {
				handle1();
			}
		} catch (Exc2 e) {
			handle2();
		}
	}
	
	abstract void tryThis() throws Exc1, Exc2;
	
	abstract void handle1();
	
	abstract void handle2();	
	
	/*
	 * IV. 8 Kontrollfluss von Unterprogrammen
	 */	
	public void subroutineJump() throws Exc1, Exc2 {
		try {
			tryThis();
		} finally {
			doThat();
		}
	}
	
	abstract void doThat();
}

