目录
规则:
1.当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定。
2.当调用对象属性时,没有动态绑定机制,哪里声明,那里使用。
案例:
父类A
class A {//父类
public int i = 10;
public int sum() {
return getI() + 10;
}
public int sum1() {
return i + 10;
}
public int getI() {
return i;
}
}
子类B
class B extends A {//子类
public int i = 20;
public int sum() {
return i + 20;
}
public int sum1() {
return i + 10;
}
public int getI() {
return i;
}
}
测试类
public class DynamicBinding {
public static void main(String[] args) {
A a = new B();//向上转型
System.out.println(a.sum());//?
System.out.println(a.sum1());//?
}
}
这个很简单,看结果
改一下B类,将sum1注释
class B extends A {//子类
public int i = 20;
public int sum() {
return i + 20;
}
// public int sum1() {
// return i + 10;
// }
public int getI() {
return i;
}
}
这个也很简单,看结果
将sum注释
class B extends A {//子类
public int i = 20;
// public int sum() {
// return i + 20;
// }
public int sum1() {
return i + 10;
}
public int getI() {
return i;
}
}
这个时候需要看一下A类的sum
class A {//父类
public int i = 10;
public int sum() {
return getI() + 10;
}
public int sum1() {
return i + 10;
}
public int getI() {
return i;
}
}
看一下结果
有人可能会想第一个结果怎么会是30呢,不是10+10吗?这么想是错误的,父类的sum调用的getI方法是从运行类型开始查找的,在B类中找到了getI就调用,那么getI返回的i又是哪个类的呢?答案是在哪个类的方法就用那个类的i,即B类的i。
属性没有动态绑定机制,即在哪个类中声明就在那个类中使用。