多态--动态绑定
1、当调用对象方法的时候,该方法会和该对象的运行类型绑定,如果在运行类型中没找到该方法,那么触发继承机制,去运行类型的父类去找方法。
2、当调用对象属性时,没有动态绑定机制,属性在哪里声明,就在哪里使用,不是看编译类型
1、
class A{
public int 1 = 10;
public int sum(){
return getI() + 10;
}
public int sum1(){
return i + 10;
}
public int getI(){
return i;
}
}
==================================
class B extends A{
public int i = 20;
public int sum(){
return i + 20;
}
public int getI(){
return i;
}
public int sum1(){
return i + 10;
}
}
==================================
public class Test{
psvm{
A a = new B();//向上转型
sout(a.sum());//运行类型是B,所以这里走b的方法sum(),输出40
sout(a.sum1());//运行类型是B,所以这里走b的方法sum1(),输出30
}
}
2、※
注意:编译类型为父类,运行类型为子类 的对象,不能直接去运行子类的方法
class A{
public int 1 = 10;
public int sum(){
return getI() + 10;
}
public int sum1(){
return i + 10;
}
public int getI(){
return i;
}
}
==================================
class B extends A{
public int i = 20;
/*
public int sum(){
return i + 20;
}
*/
public int getI(){
return i;
}
/*
public int sum1(){
return i + 10;
}
*/
}
==================================
public class Test{
psvm{
A a = new B();//向上转型
sout(a.sum());//30
//运行类型B中的sum方法消失了。触发继承机制,找父类A中的sum()方法,A中sum方法getI()方法触发了动态绑定机制,去找运行类型B的getI()方法,B中getI()方法的i在B中声明,那么i的值就是20。总结下来,这里用A中的sum()=20++10方法,B的getI()=20,B的i=20,输出30
sout(a.sum1());//20
//运行类型B中sum1()方法消失了。触发机制,找父类A中的sum1()方法,A中sum1()方法中的i在父类A中被声明,那么这里的i=10。总结下来,这里用A中的sum()1=10+10,A的i=10,输出20
}
}