next up previous contents
Next: Inheritance 7: Abstract Class Up: Java Notes Previous: Inheritance 5: Method Call

Inheritance 6: Method Lookup


/**
 *  This code is from the book:
 *  Winder, R and Roberts, G (1998)
 *  Developing Java Software</em>
 *  John Wiley & Sons.
 *  It is copyright (c) 1997 Russel Winder
 *  and Graham Roberts.
 */

class A{
  protected static String name = "A";

  public void f(){
    System.out.println(name + " f");
  }
}

class Superclass{
  protected static String name = "Superclass";
  protected String vname =
		"Superclass instance variable";

  public void name(){
    System.out.println(name);
  }
}

class Subclass extends Superclass{
  protected static String name = "Subclass";
  protected String vname = 
                   "Subclass instance variable";

  private class Member extends A{
		//Member class can inherit
    public void show(){
      //instance variable
      //OK as instance name hides any inherited
      //or contained name
      System.out.println(name);

      //Variables can be explicitly used 
      //from each scope using this syntax
      System.out.println(Subclass.this.name);
      System.out.println(Superclass.this.name);
      System.out.println(A.this.name);
      System.out.println(Subclass.this.vname);
      System.out.println(Superclass.this.vname);

      //No conflict here as only containment
      //hierarchy has a vname
      System.out.println(vname);

      //Containing object methods can be called.
      Subclass.this.name();
      Superclass.this.name();

      //If this is omitted then method in the containing
      //object can still be accessed. As no method name
      //is inherited there is also no conflict
      name();

      //Ambiguous due to name conflict between inheritance
      //and containment
      //f(); //Error
      A.this.f();
      Subclass.this.f();
    }

    public void test(int x){
      System.out.println(name + " test");
    }

    private String name = "Member";
  }

  public void name(){
    System.out.println(name);
  }

  public void test(){
    Member m = new Member();
    m.show();
  }

  public void f(){
    System.out.println("Subclass:f");
  }
}

class l1Inherit6{//Lookup1
  public static void main(String[] args){
    Subclass subclass = new Subclass();
    subclass.test();
  }
}
/******** sample compilation & run *******
# javac l1Inherit6.java 
# java l1Inherit6
Member
Subclass
Superclass
A
Subclass instance variable
Superclass instance variable
Subclass instance variable
Subclass
Subclass
Subclass
A f
Subclass:f
# 
******************************************/



Ananda Amatya
9/15/1999