引导案例
public class JTest {
public static void main (Stirng[] args) throws Exception {
AAA aaa = new BBB();
System.out.println(aaa.getResult());
}
}
class AAA {
public int i = 10;
public int getResult(){
return i+10;
}
}
class BBB extends AAA {
public int i = 20;
/*public int getResult(){
return i+20;
}*/
}
思考:控制台打印结果
何时触发动态绑定机制?
- 成员方法执行时,JVM会将被调用方法和此方法所属对象的实际内存进行绑定,注意:方法所属对象的实际内存并不取决于引用变量的“类型”,而取决于内存绑定的结果。
- 但是属性的调用不会触发动态绑定机制,当子类与父类变量同名时,具体使用哪一个变量,取决于方法调用时具体绑定的是子类对象内存还是父类对象的内存。
内存绑定的依据
- 实例对象(而不是引用变量所代表的类)所属类中是否有触发动态绑定的方法,如果有就绑定此实例对象的内存。
- 如果没有就查看父类中是否有触发动态绑定的方法,如果有就绑定父类对象内存空间。
检测案例
public class JTest {
public static void main (Stirng[] args) throws Exception {
BBB bbb = new BBB();
System.out.println(bbb.getResult());
}
}
class AAA {
public int i = 10;
public int getResult(){
return i+10;
}
}
class BBB extends AAA {
public int i = 20;
/*public int getResult(){
return i+20;
}*/
}
两个案例的输出结果都是20.