java多态是其语言一大特性,对多态最直接的理解可以是认为同一方法在不同条件下使用会有不同的效果。就像在不同状态下对同一操作进行触发操作得到的结果不同。举个例子:在计算机里面不同的菜单下同样按下按键K获取的结果不一样。还是先来看几个代码深入理解一下:
student st=new student();
st.print(2);
st.print(2,3);
st.print(2,3,5);
st.print(1.1);
st.print(1.1,2.2);
st.print(1.1,2.2,3.3);
创建学生对象st,对象可以调用同一方法名,但是参数类型和参数个数可以不同,前面说过可以认为这是方法重载。这也是多态的一种,是属于一种静态绑定。重载与覆盖多属于多态中的一种情况。
关于静态绑定
在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现。
针对java简单的可以理解为程序编译期的绑定;
关于动态绑定
动态绑定是指在执行期间(非编译期)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。程序运行过程中,把函数(或过程)调用与响应调用所需要的代码相结合的过程称为动态绑定。动态绑定是一种后期绑定:在运行时根据具体对象的类型进行绑定。提起这个还需要提一下向上转型:
关于向上转型
向上转型多与覆盖技术相结合。例如:father s= new son();son类就是继承father类得到的,那么这时候可以这么理解:对象s是son类的实例对象,但是又属于父类,然后把它强制转型为father类对象。所以father类方法被子类son类中的方法覆盖。来看下面这个实例:
class A{
public void A1(){
System.out.println("父类方法1");
}
public void A2(){
System.out.println("父类方法2");
}
}
class B extends A{
public void A1() {
System.out.println("子类方法1");
}
public void B2() {
System.out.println("子类方法2");
}
}
public class C{
public static void main(String args[]){
A a=new B();
}
}
上面给出了A类与B类的继承关系,B类作为A类的子类除了扩展了自己的B2()方法还有父类A1方法。这样A a=new B(); 就产生了向上转型。对象a虽然是B的实例对象,但是却强制转换为A类对象。接下来可以做一下下面的三个测试:
a.A1();
a.A2();
a.B2();