Contiuning Reading Java Language Specification turned to section Interfaces Section
Can any one predict the output of the following program?
class SuperClass {
public int size=10;
void m1(int size) {
size=this.size;
System.out.println("superclass:m1:" + this.size);
}
}
class SubClass extends SuperClass {
public int size=20;
void m1(int size) {
size=this.size;
System.out.println("subclass:m1:" + this.size);
}
}
public class InterfaceAnotherExample {
public static void main(String[] args) {
SuperClass superClass=new SuperClass();
SubClass subClass=new SubClass();
superClass.size=33;
subClass.size=55;
superClass.m1(superClass.size);
subClass.m1(superClass.size);
superClass.m1(subClass.size);
subClass.m1(subClass.size);
System.out.println(superClass.size);
System.out.println(subClass.size);
superClass=subClass;
superClass.m1(subClass.size);
subClass.m1(subClass.size);
superClass.m1(superClass.size);
subClass.m1(superClass.size);
System.out.println(superClass.size);
System.out.println(subClass.size);
}
}
Well Output is:
superclass:m1:33
subclass:m1:55
superclass:m1:33
subclass:m1:55
33
55
subclass:m1:55
subclass:m1:55
subclass:m1:55
subclass:m1:55
10
55
Why? Always remember that it is only methods which gets overrided but not fields.Fields only get shadowed.
Also we are actually not assigning current class object variable if you closely look into this line "size=this.size".
Hence all the object fields values never change until the below statement is executed."superClass=subClass;"
Now in method m1() as we are printing current Class Object variable it always prints subclass object field value only when printed.
But System.out.println(superClass.size); prints superClass initial value(10) as after assignment takes place field values get's prepopulated with initial values.
Similarly
class A {
public final int size=10;
public void m1() {
System.out.println("superclass" + size);
}
}
interface InterfaceA {
public final int size=20;
void m1();
}
public class InheritanceInterfaceExamples extends A implements InterfaceA {
public final int size=30;
public void m1() {
System.out.println("subclass" + size);
}
public static void main(String[] args) {
A a=new InheritanceInterfaceExamples();
a.m1();
System.out.println("a.size:" + a.size);
System.out.println("\n");
InterfaceA interfaceA=new InheritanceInterfaceExamples();
interfaceA.m1();
System.out.println("interfaceA.size:" + interfaceA.size);
}
}
prints:
subclass30
a.size:10
subclass30
interfaceA.size:20
Because again as discussed fields never get overrided.Hence interfaceA.size prints actual interface constant value.
Hope it helps and please let me know if any further explanation required.
Monday, 10 September 2007
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment