/**
* This code is from the book:
* Winder, R and Roberts, G (1998)
* Developing Java Software
* John Wiley & Sons.
* It is copyright (c) 1997 Russel Winder
* and Graham Roberts.
*/
class Superclass{
//May be overridden
public void f(int x){
System.out.println("Superclass f: " + x);
//Always calls g declared by this class
//as g is private
g();
}
//Can't override this method
private void g(){
System.out.println("Superclass g");
}
//May be overridden
protected void h(){
System.out.println("Superclass h");
}
public void k(){
System.out.println("Superclass k");
//Always call superclass g as
//g cannot be overridden
g();
//Call h depending on type of object
//(type of this) using dynamic binding
h();
//Always call s in this class, as s is static
s();
}
public static void s(){
System.out.println("Superclass static s");
}
}
class Subclass extends Superclass{
//Overriding method - must be public
public void f(int x){
System.out.println("Subclass f: " + x);
//Call g in this class
g();
}
//New version of g
//not overriding version in Superclass
private void g(){
System.out.println("Subclass g");
}
//Overridding inherited h with increased access
//Making this private or default access
//would be an error
public void h(){
System.out.println("Subclass h");
}
public static void s(){
System.out.println("Subclass static s");
}
}
public class l1Inherit2{//Override
public static void main(String[] args){
Superclass superclass = new Superclass();
//Call superclass version of f
superclass.f(1);
superclass.h();
superclass.k();
superclass.s();
Subclass subclass = new Subclass();
//Call overridden subclass version of f and h
subclass.f(2);
subclass.h();
//Call superclass k as it is not overridden
subclass.k();
//Call subclass s
subclass.s();
//Now set a variable of superclass type to
//reference a subclass object
superclass = subclass;
//Call *subclass* versions of f and h
superclass.f(3);
superclass.h();
//Call superclass k for a subclass object
superclass.k();
//Call superclass s as it is static and
//not dynamically bound, so method called
//depends on type of reference.
superclass.s();
}
}
/******** sample compilation & run ********
# javac l1Inherit2.java
# java l1Inherit2
Superclass f: 1
Superclass g
Superclass h
Superclass k
Superclass g
Superclass h
Superclass static s
Superclass static s
Subclass f: 2
Subclass g
Subclass h
Superclass k
Superclass g
Subclass h
Superclass static s
Subclass static s
Subclass f: 3
Subclass g
Subclass h
Superclass k
Superclass g
Subclass h
Superclass static s
Superclass static s
#
******************************************/