java 重载 与 多态_Java 方法重载和多态

先来看看什么是方法重载?

方法重载的要求是:方法名相同,参数列表不同(不同的参数类型或者参数顺序或者参数个数)。至于方法的其他部分,如方法返回值类型和修饰符,与方法重载没有任何关系。最好加上@Overload注解。

为什么要用方法重载?

重载的目的是方便程序员调用方法。比如,System.out.println()这个函数是用来输出的,当输出的是整数时是用这个方法,当输出一个字符串时还是用这个方法。根据传入参数的不同,自动找到匹配的方法。

以下程序不使用方法重载,试着分析看看有什么缺点。

publicclassmethodtest07{

publicstaticvoidmain(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));

}

}

classCompute{

publicstaticintsumint(inta,intb){

returna+b;

}

publicstaticdoublesumdouble(doublea,doubleb){

returna+b;

}

publicstaticlongsumlong(longa,longb){

returna+b;

}

}

上述代码的缺陷就是程序员得记住三个不同的方法。(头大)

结合代码来看看哪些情况属于方法重载?代码后面有详细的注释。

//以下方法构成方法重载

publicstaticvoidm1(inta){}

publicstaticvoidm1(doublea){}

publicstaticvoidm2(inta,intb){}

publicstaticvoidm2(inta){}

publicstaticvoidm3(inta,doubleb){}

publicstaticvoidm3(doublea,intb){}

//以下m4方法不构成方法重载

publicstaticvoidm4(inta){}

publicstaticvoidm4(intb){}  //方法重复,编译无法通过

//m5方法不构成方法重载   方法的重载和方法的返回值类型无关

publicstaticvoidm5(){}

publicstaticintm5(){

return100;

}

//m6不构成方法的重载  方法的重载和方法的修饰符列表无关

staticvoidm6(){}

publicstaticvoidm6(){}

}

总结一下,方法的重载:

1.发生在同一个类中

2.方法名相同

3.参数列表不同(参数的类型,个数,顺序不同)

4.和返回值类型无关

5.和方法的修饰符列表无关

什么是多态?

多态是指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用)。继承在为多态的实现做了准备。子类继承父类,我们可以编写一个指向子类的父类类型引用,该引用既可以处理父类对象,也可以处理子类对象,当相同的消息发送给子类或者父类对象时,该对象就会根据自己所属的引用而执行不同的行为,这就是多态。即多态性就是相同的消息使得不同的类做出不同的响应。

Java实现多态有三个必要条件:继承,重写,向上转型。

继承:在多态中必须存在有继承关系的子类和父类。

重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。

向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。

只有满足了上述三个条件,我们才能够在同一个继承结构中使用同一的逻辑实现代码处理不同的对象,从而达到执行不同的行为。下面结合代码理解。

publicclassQuadrangle{

// 实例化保存四边形对象的数组对象

privateQuadrangle[] qtest =newQuadrangle[6];

privateintnextIndex =0;

publicvoiddraw(Quadrangle q){// 定义draw()方法,参数为四边形对象

if(nextIndex < qtest.length) {

qtest[nextIndex] = q;

System.out.println(nextIndex);

nextIndex++;

}

publicstaticvoidmain(String[] args){

// 实例化两个四边形对象,用于调用draw()方法

Quadrangle q =newQuadrangle();

q.draw(newSquare());// 以正方形对象为参数调用draw()方法

// 以平行四边形对象为参数调用draw()方法

q.draw(newParallelogramgle());

}

}

classSquareextendsQuadrangle{// 定义一个正方形类,继承四边形类

publicSquare(){

System.out.println("正方形");

}

}

// 定义一个平行四边形类,继承四边形类

classParallelogramgleextendsQuadrangle{

publicParallelogramgle(){

System.out.println("平行四边形");

}

}

输出:

正方形

0

平行四边形

1

从本实例运行的结果可以看出,以不同类对象为参数调用draw()方法可以处理不同的图像类问题,程序员无须在所有的子类中定义执行相同功能的方法,只要实例化一个继承父类的子类对象即可调用相应的方法,只要维护父类中的这个方法即可。

搜索微信公众号“程序员考拉”,欢迎关注!

1267092-20200421114142803-1194868128.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值