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

方法重载的要求是:方法名相同,参数列表不同(不同的参数类型或者参数顺序或者参数个数)。至于方法的其他部分,如方法返回值类型和修饰符,与方法重载没有任何关系。最好加上@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){}
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("平行四边形");
 }
}

输出:

正方形
0
平行四边形
1

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

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

Java 方法重载和多态的更多相关文章

  1. java方法——重载2

    什么是Java方法重载 方法重载的定义 1 对于同一个类,如果这个类里面有两个或者多个重名的方法,但是方法的参数个数.类型.顺序至少有一个不一样,这时候局构成方法重载. END 方法重载示例 1 pu ...

  2. Java 方法重载,方法重写(覆盖),继承等细节注意

    1.方法重载(method overload)的具体规范 如果有两个方法的方法名相同,但参数不一致,那么可以说一个方法是另一个方法的重载. 一.方法名一定要相同. 二.方法的参数表必须不同,包括参数的 ...

  3. 【知了堂学习笔记】java 方法重载与重写的归纳

    方法重载:Java的方法重载,就是在类中可以创建多个方法,它们可以有相同的名字,但必须具有不同的参数,即或者是参数的个数不同,或者是参数的类型不同.调用方法时通过传递给它们的不同个数和类型的参数来决定 ...

  4. 《Java基础知识》Java方法重载和重写

    重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也就是说子类 ...

  5. Java方法重载

    Java允许一个类中定义多个方法,只要参数列表不同就行了.如果同一个类中包含了两个或者两个以上的方法的方法名相同,但形参列表不同,则被称为方法重载. /* 参数类型不同的重载 */ public cl ...

  6. java方法重载和重写

    1.java的方法重载和重写,表示两种不同的类型.this关键字,出现在类的构造方法中,代表使用该构造方法所创建的对象.,this可以出现在实例方法中核构造方法中.但是不能出现在类方法中.实例方法只能 ...

  7. Java 方法重载 方法重写

    方法重载规则 参数个数不同 参数个数相同,但参数列表中对应的某个参数的类型不一样 方法的返回类型和参数名称不参与重载 "编译期绑定",,因为未产生对象,只看参数.引用类型绑定方法 ...

  8. C# 继承、虚方法、方法重载和多态

    继承:继承属于单继承,只能继承一个父类. 继承的一个结果是派生于基类的子类在方法和属性上有一定的重叠. 继承只能够同时继承与一个基类:可以同时继承一个基类和多个接口,但是基类必须放在第一个.(注:C# ...

  9. [Java学习] Java方法重载

    在Java中,同一个类中的多个方法可以有相同的名字,只要它们的参数列表不同就可以,这被称为方法重载(method overloading). 参数列表又叫参数签名,包括参数的类型.参数的个数和参数的顺 ...

随机推荐

  1. JavaScript 实现用户点击图片放大

    JavaScript 实现用户点击图片放大 一.契机 情况是这样的,之前推荐朋友去建站.后面他专门写了一篇文章说如何实现 "用户点击图片实现放大效果",俺就好好 "拜读& ...

  2. Linux 与 Windows 搭建域名解析

    实现 Win2012-D1 中 DNS 服务器的冗余备份,同时提供本域内主机名与 IP 地址的解析,此域名服务器的地址数据库需要 Win2012-D1 中定期更新. 假设环境:Server12 以及  ...

  3. 部署LNMP架构及其应用

    部署企业LNMP架构 (一)首先安装nginx服务,具体请见另一篇关于nginx的博文. (二)安装MySQL数据库 .安装前准备 [root@localhost ~]# rpm -e mysql-s ...

  4. iOS 本地时间、UTC时间、时间戳等操作、获取当前年月日

    //获得当前时间并且转为字符串 - (NSString *)dateTransformToTimeString { NSDate *currentDate = [NSDate date];//获得当前 ...

  5. Windows/Ubuntu下,将所有文件名字列举出来并保存到txt文件中

    Windows下 使用如下的DOS命令来实现: dir /s /b > lists.txt 可以将当前路径下的所有文件的"文件路径+文件名"存储在lists.txt中. 其中 ...

  6. C++ 创建类时常考虑的问题

    目录 继承 抽象接口 标准设计模式 初始化与析构模型 定义复制构造函数和赋值操作 模板 操作符 类型转换操作符 友元 非功能性约束 本文仅以c++为例,简要说明创建一个类时我们需要考虑的问题.创建一个 ...

  7. git笔记记录

    廖雪峰Git教程学习记录. 0.常用命令总结: pwd 命令用于显示当前目录 git init 命令把这个目录(自己建的文件夹)变成Git可以管理的仓库(必须切换到当前文件夹下面执行这个命令) ls ...

  8. yum的repo文件详解、以及epel简介、yum源的更换

    一.什么是repo文件        repo文件是Fedora中yum源(软件仓库)的配置文件,通常一个repo文件定义了一个或者多个软件仓库的细节内容,例如我们将从哪里下载需要安装或者升级的软件包 ...

  9. Android微信支付流程及返回码-1之坑

    http://www.51testing.com/html/36/n-3724336.html 之前做微信支付的时候,直接是以库形式引入项目的,虽然一直觉得微信支付的开发文档不太理想,但是印象中也没有 ...

  10. python PIL库的使用

    )PIL可以做很多和图像处理相关的事情: 图像归档(Image Archives).PIL非常适合于图像归档以及图像的批处理任务.你可以使用PIL创建缩略图,转换图像格式,打印图像等等. 图像展示(I ...