Re: overriding inner classes

From: Adam (NOTFORSPAM.a_szczeblewski_at_poczta.onet.pl)
Date: 09/23/04


Date: Thu, 23 Sep 2004 17:26:03 +0200


> Doesn't java support overriding inner classes?
>
> // BEGIN EXAMPLE
> // class code ------------------------------------------
>
> public class ClassA{
> LocalClass instance;
>
> // inner class
> private class LocalClass{
> public void doit(){
> System.out.println("Hello");
> }
> }
>
> ClassA(){
> instance = new LocalClass();
> }
>
> public void doit(){
> instance.doit();
> }
> }
>
> public class ClassB extends ClassA{
> LocalClass instance;
>
> // inner class
> private class LocalClass{
> public void doit(){
> System.out.println("Goodbye");
> }
> }
> }
>
> public class Main
> {
> public static void main(String[] args){
> ClassA ca;
> ClassB cb;
>
> ca = new ClassA();
> cb = new ClassB();
>
> ca.doit();
> cb.doit();
> }
> }

1. There is no such thing like overriding a class, so I don't know
what do you mean by that.
2. You haven't constructed anywhere in your code an instance of
ClassB.LocalClass,
so dont count on executing any code from that class.
3. In you code, ClassB has
a- definition of an inner class ClassA.LocalClass (derived from
ClassA, but invisible - marked private)
b- definition of an inner class ClassB.LocalClass (unrelated to above)
c- reference of type ClassA.LocalClass called 'instance', derived from
ClassA, invisible (private in superclass),
referencing a ClassA.LocalClass object created in ClassA constructor
d- reference of type ClassB.LocalClass, pointing to null
That is really messy, and proves nothing.
Calling cb.doit() calls doit() on reference mentioned in point c,
and Hello is printed.

Anyway, I think what you mean is:
/// InnerOverride.java
class Base{
 protected class InnerBase{
  void doit(){
   System.out.println("Hello");
  }
 }

 void doit(){
  getInner().doit();
 }
 InnerBase getInner(){
  return new InnerBase();
 }
}

class Derived extends Base{
 protected class InnerDerived extends InnerBase {
  void doit() {
   System.out.println("GoodBye");
  }
 }
        InnerBase getInner(){
  return new InnerDerived();
 }

}

public class InnerOverride{
 public static void main(String[] args) {
  Base one = new Base();
  Base two = new Derived();
  one.doit();
  two.doit();
 }
}
///end of code
Adam



Relevant Pages