多态的作用消除类型之间的耦合关系。而继承允许将对象视为他自己本身类型或其基类型来加以处理。多态方法调用允许一种类型表现出与其他相似类型之间的区别(只要是它们从同一基类导出来的)。这种区别是根据方法的行为不同而表示出来的,虽然这些方法都可以通过同一个基类导出。
我们可以通过向上转型实现多态,可是通过向上转型编译器又如何知道我们调用的是那个导出类方法呢?
答案就是方法调用的后期绑定,也就是说编译器一直不知道对象的类型,但是方法调用机制能找到正确的方法体,并加以调用。
java除了static和final方法(private方法属于final方法)之外,其他的方法都是后期绑定的。
java多态是相对方法而言的,因此常量是无法实现多态的。
上面说过 static final这俩域不是后期绑定因此也无法实现多态。
---------下面我们给出一个例子来帮助理解多态
//package example;
public class shap {
public int i=0;
shap(){
System.out.println("基类初始化之前");
sh();-------------------------------------------------1
System.out.println("基类初始化之后");
};
void sh(){
System.out.println("我是基类");
}
}
//package example;
public class zf extends shap{
zf(){
System.out.println(i);
};
private int i =2;
public void sh(){
System.out.println("我是正方形"+i);
}
static int j=3;
}
//package example;
public class exister {
public static void main(String[] argv) {
new zf();
}
}
/*
基类初始化之前
我是正方形0
基类初始化之后
2
*/
上面这个例子我本来用说明其他问题的,但是偷个懒解释下多态
从上面的输出我们可以看出标记1的地方在初始化的时候会调用zf的sh方法,说明编译器已经把基类里面的覆盖了。这个时候你在main方法中加上
shap.sh();这个代码那么这个代码不回去调用shap里面的sh而是调用zf里面的sh,会输出我是正方形2。
在没有需要向上转型的必要,感觉组合还时好用点,毕竟灵活,想咋用咋用。要想安全的调用基类里面的方法只有private,至于初始化的过程可自己打断点测试,至于我想说的另一个问题大家应该也看出来了,就百度下,有好的建议记着在评论区留言呢!
多态意味着‘不同的形式’。在面向对象的程序设计中,我们持有从基类继承而来的相同接口,以及使用改接口的不同形式:不同版本的动态绑定方法。为了在在自己的程序中有效的运用多态乃至面向对象的技术,必须扩展自己的编程视野,使其不仅包括个别类的成员和消息,而且还要包括类与类之间的共同特性以及它们之间的关系。它可以带给我们很多的成效:更快的程序开发过程,更好的代码组织,更好扩展的程序以及更容易的代码维护等。
-----来自一个工作半年的小白
加班中,不能再写了-0-.