Java⽅法重载和多态
先来看看什么是⽅法重载?
⽅法重载的要求是:⽅法名相同,参数列表不同(不同的参数类型或者参数顺序或者参数个数)。⾄于⽅法的其他部分,如⽅法返回值类型和修饰符,与⽅法重载没有任何关系。最好加上@Overload注解。
为什么要⽤⽅法重载?
重载的⽬的是⽅便程序员调⽤⽅法。⽐如,System.out.println()这个函数是⽤来输出的,当输出的是整数时是⽤这个⽅法,当输出⼀个字符串时还是⽤这个⽅法。根据传⼊参数的不同,⾃动到匹配的⽅法。
以下程序不使⽤⽅法重载,试着分析看看有什么缺点。
public class methodtest07{
public static void main(String[] args){
//缺点:对于程序员来说,需要记忆三个不同的⽅法
System.out.println(Compute.sumint(128,42));
System.out.println(Compute.sumdouble(121.23,242.432));
System.out.println(Compute.sumlong(234L,3242L));
}
}
class Compute{
public static int sumint(int a,int b){
return a+b;
}
public static double sumdouble(double a,double b){
return a+b;
}
public static long sumlong(long a,long b){
return a+b;
}
}
上述代码的缺陷就是程序员得记住三个不同的⽅法。(头⼤)
结合代码来看看哪些情况属于⽅法重载?代码后⾯有详细的注释。
//以下⽅法构成⽅法重载
public static void m1(int a){}
public static void m1(double a){}
public static void m2(int a,int b){}
java重写和重载的区别
public static void m2(int a){}
public static void m3(int a,double b){}
public static void m3(double a,int b){}
//以下m4⽅法不构成⽅法重载
public static void m4(int a){}
public static void m4(int b){}  //⽅法重复,编译⽆法通过
//m5⽅法不构成⽅法重载⽅法的重载和⽅法的返回值类型⽆关
public static void m5(){}
public static int m5(){
return 100;
}
/
/m6不构成⽅法的重载⽅法的重载和⽅法的修饰符列表⽆关
static void m6(){}
public static void m6(){}
}
总结⼀下,⽅法的重载:
1.发⽣在同⼀个类中
2.⽅法名相同
3.参数列表不同(参数的类型,个数,顺序不同)
4.和返回值类型⽆关
5.和⽅法的修饰符列表⽆关
什么是多态?
多态是指允许不同类的对象对同⼀消息做出响应。即同⼀消息可以根据发送对象的不同⽽采⽤多种不同的⾏为⽅式(发送消息就是函数调⽤)。继承在为多态的实现做了准备。⼦类继承⽗类,我们可以编写⼀个指向⼦类的⽗类类型引⽤,该引⽤既可以处理⽗类对象,也可以处理⼦类对象,当相同的消息发送给⼦类或者⽗类对象时,该对象就会根据⾃⼰所属的引⽤⽽执⾏不同的⾏为,这就是多态。即多态性就是相同的消息使得不同的类做出不同的响应。
Java实现多态有三个必要条件:继承,重写,向上转型。
继承:在多态中必须存在有继承关系的⼦类和⽗类。
重写:⼦类对⽗类中某些⽅法进⾏重新定义,在调⽤这些⽅法时就会调⽤⼦类的⽅法。
向上转型:在多态中需要将⼦类的引⽤赋给⽗类对象,只有这样该引⽤才能够具备技能调⽤⽗类的⽅法和⼦类的⽅法。
只有满⾜了上述三个条件,我们才能够在同⼀个继承结构中使⽤同⼀的逻辑实现代码处理不同的对象,从⽽达到执⾏不同的⾏为。下⾯结合代码理解。
public class Quadrangle {
// 实例化保存四边形对象的数组对象
private Quadrangle[] qtest = new Quadrangle[6];
private int nextIndex = 0;
public void draw(Quadrangle q) { // 定义draw()⽅法,参数为四边形对象
if (nextIndex < qtest.length) {
qtest[nextIndex] = q;
System.out.println(nextIndex);
nextIndex++;
}
public static void main(String[] args) {
// 实例化两个四边形对象,⽤于调⽤draw()⽅法
Quadrangle q = new Quadrangle();
q.draw(new Square()); // 以正⽅形对象为参数调⽤draw()⽅法
// 以平⾏四边形对象为参数调⽤draw()⽅法
q.draw(new Parallelogramgle());
}
}
class Square extends Quadrangle { // 定义⼀个正⽅形类,继承四边形类
public Square() {
System.out.println("正⽅形");
}
}
// 定义⼀个平⾏四边形类,继承四边形类
class Parallelogramgle extends Quadrangle {
public Parallelogramgle() {
System.out.println("平⾏四边形");
}
}
输出:
正⽅形
平⾏四边形
1
从本实例运⾏的结果可以看出,以不同类对象为参数调⽤draw()⽅法可以处理不同的图像类问题,程序员⽆须在所有的⼦类中定义执⾏相同功能的⽅法,只要实例化⼀个继承⽗类的⼦类对象即可调⽤相应的⽅法,只要维护⽗类中的这个⽅法即可。
搜索“程序员考拉”,欢迎关注!