After learning Java for sometime, its the first time the use of this keyword has confused me so much.
Here is how I got confused. I wrote the following
1. Why x and this.x point to the x of base class and not the Child class?
we can see this example:
class TestBase {
private int x;
public void a() {
this.x++;
}
public int getX() {
return x;
}
}
public class Test extends TestBase{
private int x;
public int getX() {
return this.x;
}
}
and generated bytecode:
public class Test extends TestBase{
public Test();
Code:
0: aload_0
1: invokespecial #1; //Method TestBase."":()V
4: return
public int getX();
Code:
0: aload_0
1: getfield #2; //Field x:I
4: ireturn
public void a();
Code:
0: aload_0
1: invokespecial #3; //Method TestBase.a:()V
4: return
}
In there the Test extends TestBase and the method a is compiled into the Test class, it will call it's father 1: invokespecial #3; //Method TestBase.a:()V.
the Test's getX method will call 1: getfield #2; //Field x:I from it's own constant pool table, http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings
the TestBase class bytecode:
class TestBase extends java.lang.Object{
TestBase();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."":()V
4: return
public void a();
Code:
0: aload_0
1: dup
2: getfield #2; //Field x:I
5: iconst_1
6: iadd
7: putfield #2; //Field x:I
10: return
public int getX();
Code:
0: aload_0
1: getfield #2; //Field x:I
4: ireturn
}
the method a() also will get x from it's own constant pool by getfield #2; //Field x:I.
so there is another thing: the Java's getter and setter is evil.