// super

class Data1 {
    protected String s;
    Data1(String s) {
	this.s = s;
	System.out.println("Activating constructor of " + s);
	print();
    }
    protected void print() {
	System.out.println("1: " + s);
    }
}

class Data2 extends Data1 {
    Data2(String s) {
	super(s);
	System.out.println("Activating constructor of " + s);
	print();
	super.print();
    }
    protected void print() {
	System.out.println("2: " + s);
    }
}  

class Data3 extends Data2 {
    Data3(String s) {
	super(s);
	System.out.println("Activating constructor of " + s);
	print();
	super.print();
	// What about using print() from Data1? Try:
	// super.super.print();
	// But, super.super won't work!
	// You could define another method in Data1
	// that acts like print, but don't override it.
    }
    protected void print() {
	System.out.println("3: " + s);
    }
}

public class super2 {
    public static void main(String args[]) {
	Data1 d1 = new Data1("data1");
	Data2 d2 = new Data2("data2");
	Data3 d3 = new Data3("data3");
    }
}

/* Output:
Activating constructor of data1
1: data1
Activating constructor of data2
2: data2
Activating constructor of data2
2: data2
1: data2
Activating constructor of data3
3: data3
Activating constructor of data3
3: data3
1: data3
Activating constructor of data3
3: data3
2: data3
*/


