- 当JVM执行对象的成员方法时,会将方法和当前对象的实际内存进行绑定。
public class TestObject {
public static void main(String[] args) {
A a = new B();
//当JVM执行对象的成员方法时,会将方法和当前对象的实际内存进行绑定。
//动态邦定机制和属性没有关系。
System.out.println(a.getResult());
}
}
class A {
public int i = 10;
public int getResult(){
return i + 10;
}
}
class B extends A{
public int i = 20;
public int getResult(){
//这里i其实有两个值,一个是super.i = 10 ,另一个是this.i = 20,这里用的是this.i = 10。
return i + 20;
}
}
输出结果:40
画图分析内存图:
因为B继承了A,所以B中也有getResult()方法,当调用getResult()方法时,因为B和A中都有这个方法,那么到底应该调用哪个里面的getResult()呢?这个时候就用到了Java对象的动态绑定机制: 当JVM执行对象的成员方法时,会将方法和当前对象的实际内存进行绑定。
因为B中有getResult()方法,所以调用的就是B中的方法,所以结果才是40。
- 动态邦定机制和属性没有关系。
public class TestObject {
public static void main(String[] args) {
A a = new B();
//当JVM执行对象的成员方法时,会将方法和当前对象的实际内存进行绑定。
//动态邦定机制和属性没有关系。
System.out.println(a.getResult());
}
}
class A {
public int i = 10;
public int getResult(){
return i + 10;
}
}
class B extends A{
public int i = 20;
// public int getResult(){
//
// return i + 20;
// }
}
输出结果:20
如上代码所示,当注释掉B中的getResult()方法后,因为B中没有getResult()方法,所以调用的就是A中的getResult()。又因为动态绑定机制和属性没有关系,所以A中相当于是“return this.i + 10”。
-
this代表的就是当前对象,只不过A中省略了,所以结果是20。
内存图
网友评论