Java拾贝第四天——动态绑定机制
Java拾贝不建议作为0基础学习,都是本人想到什么写什么
//根据面向对象3中提及的属性看对象,方法看指向。试想如下代码
public class Test4 {
public static void main(String[] args) {
Base base = new Sub();
System.out.println(base.sum());
System.out.println(base.sum1());
}
}
class Base {
int i = 10;
public int geti() {
return i;
}
public int sum() {
return geti() + 10;
}
public int sum1() {
return i + 10;
}
}
class Sub extends Base {
int i = 20;
public int geti() {
return i;
}
public int sum() {
return geti() + 20;
}
public int sum1() {
return i + 10;
}
}
不难发现,打印结果为40 30。
那如果将Sub类中sum()方法去掉呢?
//试想如下代码
public class Test4 {
public static void main(String[] args) {
Base base = new Sub();
System.out.println(base.sum());
System.out.println(base.sum1());
}
}
class Base {
int i = 10;
public int geti() {
return i;
}
public int sum() {
return geti() + 10;
}
public int sum1() {
return i + 10;
}
}
class Sub extends Base {
int i = 20;
public int geti() {
return i;
}
public int sum1() {
return i + 10;
}
}
base.sum()过程解析如下:
- 根据方法看指向,进入Sub类中寻找sum()方法
- 寻找无果,进入其父Base类中寻sum()方法
- 找到了!调用sum()方法,发现其调用geti()方法 ⭐
- 根据方法看指向,进入Sub类中寻找geti()方法
- 调用geti()方法⭐,并返回Sub类中的整型i(20)
- 返回Base类类中的sum()方法,进行+10;
- 结果为30
所以上述代码打印结果为30 30。
那如果再将Sub类中sum1()方法去掉呢?
//你知道结果吗?
public class Test4 {
public static void main(String[] args) {
Base base = new Sub();
System.out.println(base.sum());
System.out.println(base.sum1());
}
}
class Base {
int i = 10;
public int geti() {
return i;
}
public int sum() {
return geti() + 10;
}
public int sum1() {
return i + 10;
}
}
class Sub extends Base {
int i = 20;
public int geti() {
return i;
}
打印结果为30 20。
所以Java的动态绑定机制:
-
当调用方法时,该方法会和该对象的指向类型绑定。
-
当调用属性时,没有动态绑定机制,属性还是看对象。
上述就是Java的动态绑定机制。