要理解多态,就必须有一个大的理解方向,不然很容易绕进去。
首先知道多态的释义:多态性是指一个名词可以有多种语义。
对于java的多态性学习者来说,就是必须要知道多个同名方法在不同情况下的使用规则。
java的同名方法只能通过两种机制实现。覆盖和重载。(覆盖一般出现在继承中,子类覆盖父类,而重载一般出现在同一个类中,参数不同的同名方法,c++中也有)
先探讨重载。
一、我们知道重载需要参数不同,那么不同体现在哪里?
1、参数的个数
2、参数的类型不同
3、参数的位置(这已经包含在上述两者之中)
下面分别体现参数的个数,类型不同引起的重载
public class TestOverload_1 {
public void showMsg() {
System.out.println("a method without parameter");
}
public void showMsg(int k) {//这是对方法的重载
System.out.println("a method parameter with k , k = "+k);
}
public static void main(String args[]) {
TestOverload_1 oa =new TestOverload_1();
oa.showMsg();
oa.showMsg(100);
}
}
public class TestOverload_2 {
public void showMsg(char ch) {
System.out.println("a method with character parameter ch,ch= "+ch);
}
public void showMsg(int k) {
System.out.println("a method with integer parameter k,k= "+k);
}
public static void main(String args[]) {
TestOverload_2 oa = new TestOverload_2();
oa.showMsg('a');
oa.showMsg(3);
}
}
注意:对于静态和普通实例方法的重载是一致的,它们之间也可以相互重载,同理构造方法也能进行重载。,修饰符没有任何限制。
二、关于重载的编译解析原理过程大概如下:
先根据调用的方法名查找是否有该方法--------->比较形参与实参数目,如多个符合,进入候选集---------->从候选集中比较类型是否匹配,如有多个匹配,进入可行集------->查找最佳匹配,如同时存在形参为int 型 与double型方法,选择转换较少的,若转换相同,则报错
源码如下:
public class Matching {
public void show(int a,int b,int c) {
System.out.println("1---a="+a+",b="+b+",c="+c);
}
public void show(int a,int b,double c) {
System.out.println("2---a="+a+",b="+b+",c="+c);
}
public void show(int a,double b,double c) {
System.out.println("3---a="+a+",b="+b+",c="+c);
}
public void show(double a,double b, int c) {
System.out.println("4---a="+a+",b="+b+",c="+c);
}
public void call() {
show(1, 2, 3);//匹配第一个
// show(1.0, 2.0, 3.0);//没有一个可行的方法
show(1.0, 2, 3);//最佳匹配第四个
// show(1, 2.0, 3);//三,四匹配,但没有最佳,所以不通过
show(1, 2, 3.0f);//匹配第二个 }
}
好了,以上就是关于java多态在重载时的一些规则与原理。关于覆盖的规则与理解在这一篇文章中。