多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。
java中的复用类是java中重要的一个概念,可以支持java多态的实现,在复用中我有时会将重载和重写这两个概念搞混了,现记录下。
一:方法重载
方法重载是让类统一处理不同类型数据的一种机制,重载可以让同一名字的函数具有不同的参数类型以及个数,调用他们可以通过传递不同参数类型和参数个数来区别,注意方法参数列表中参数的顺序不同也一样可以区分不同方法,但是JAVA中不建议这么做。而且重载的返回类型可以相同也可以不同,但是注意JAVA无法通过不同的返回类型来区别不同的函数,因此返回类型不同不能进行重载。像我另外一篇随记中所述的this用法,不同构造器中,参数不同也能进行重载,如下代码中,构造函数具有不同参数。
而重载的规则:
1、必须具有不同的参数列表;
2、可以有不责骂的返回类型,只要参数列表不同就可以了;
3、可以有不同的访问修饰符;
4、可以抛出不同的异常;
package test;
public class TestThis {
int count = 0;
String s = "initial value";
TestThis(int petals) {
// TODO Auto-generated constructor stub
count = petals;
System.out.println("Constructor int only,count="+petals);
}
TestThis(String ss) {
// TODO Auto-generated constructor stub
System.out.println("Constructor String only,s="+ss);
}
TestThis(String s,int petals) {
// TODO Auto-generated constructor stub
this(petals);
this.s=s;
System.out.println("int & String");
}
TestThis() {
// TODO Auto-generated constructor stub
this("hi", 11);
System.out.println("default");
}
void printPetalCount(){
System.out.println("count= "+count+" s="+s);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
TestThis x = new TestThis();
x.printPetalCount();
}
}
二:重写
重写又叫覆盖,指的是导出类修改基类的方法,或者子类需要修改父类的方法,得到不同结果。
重写方法的规则:
1、参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。
2、返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载。
3、访问修饰符的限制一定要大于等于被重写方法的访问修饰符(public>protected>default>private)。
4、重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。例如:
父类的一个方法申明了一个检查异常IOException,在重写这个方法是就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常。
重写与重载的区别在于:
重写多态性起作用,对调用被重载过的方法可以大大减少代码的输入量,同一个方法名只要往里面传递不同的参数就可以拥有不同的功能或返回值。
用好重写和重载可以设计一个结构清晰而简洁的类,可以说重写和重载在编写代码过程中的作用非同一般.