Java-多态、方法重载

什么是多态、重载

1. 多态

对多态现象的理解

多态是面向对象的一个重要特征。关于定义性的概念,相信网上有很多资料,不再多说。这里说说我自己的理解。多态是指在运行期间,调用某个类对象的方法会有不同的行为。举个最普遍的例子来说:

基类:Shape

class Shape{
    public void draw();
    public void clear();
}

子类: Circle 、Rectangle

class Circle extends Shape{
    public void draw(); //画一个圆
    public void clear();
}

class Rectangle extends Shape{
    public void draw(); //画一个长方形
    public void clear();
}

如果我声明一个Shape类的引用,然后初始化,最后调用这个对象的draw()方法:

Shape mShape = null;
mShape = init();
mShape.draw();

由于Rectangle类的对象和Circle类的对象都可以向上转换为Shape的对象,所以当我调用mShape.draw()方法后,可能会画一个圆,也有可能会画一个长方形,这完全取决于init()方法返回的对象是什么。这种现象称为多态,而且这种现象在现实中是普遍存在的,例如对来说,有汽车电动车,车都有行驶行为,对不同的车来说,会采取不同的实际行动来执行行驶这个行为,这是多态在现实中的体现。

多态发生的时机

多态发生在运行期间,这是因为不到实际运行时,我们永远不知道init()方法返回的到底是哪个实际的对象,因此多态会推迟到运行期间发生。但是当方法是static或final修饰时,在编译期间便进行绑定。原因是final方法不允许重写,而static方法是跟类绑定的,与对象无关。

2.重载

很多人会将重载跟多态混淆,多态的发生必须要有继承、重写 , 而重载不一样,重载是指同一个方法名(只指的是名字),有多个不同的版本,例如我们要写一个add方法,如果是两个数字,返回求和后的字符串。如果是两个字符串,我们就将字符串联接起来。写成代码就是如下的样子:

class Example{
    public String addInt(int a , int b){
        return (a + b) + "";
    }

    public String addString(String a , String b){
        StringBuilder temp = new StringBuilder();
        temp.append(a);
        temp.append(b);
        return temp.toString();
    }
}

但是这样会有很多不同的方法,容易造成混淆。我们编写一个方法的多个不同版本,根据传入的参数不同,调用不同版本的方法。因此就有方法重载。

class Example{
    public String add(int a , int b){
        return (a + b);
    }

    public String add(String a , String b){
        StringBuilder temp = new StringBuilder();
        temp.append(a);
        temp.append(b);
        return temp.toString();
    }
}

根据传入参数的不同,编译器会调用不同版本的方法。

重载发生的时机

由于方法调用的参数是编译期确定的,因此重载发生在编译期

重载时方法匹配的优先级

(引用自http://liujinpan75.iteye.com/blog/495562)

  1. 根据调用的方法名,查找是否有定义好的同名方法,如果没有就会报错
  2. 比较形参和实参的数目是否相等,如果没有则会报错。如果有一个或多个方法符合条件,这些方法进入候选集
  3. 与候选集中的方法比较参数表,如果对应位置上的每个参数类型完全匹配,或者可以通过扩展转换相匹配,则该方法称为可行方法,并入可行集。若不存在可行方法,则会报错
  4. 在可行集中按照下面的原则选取最佳可行方法,若最佳可行方法为0 则会报错,否则最佳可行方法就是最终确定要调用的方法

获取的原则是

1. 若每一个参数都可以完全匹配,它就是最佳可行方法

2. 若某个方法的每一个参数都不比别的方法差,且至少有一个参数比别的方法好,它就是最佳可行方法,这里的差和好是指,完全匹配要比扩展转化好,不过同样是扩展转换,仍然存在好和差的问题,扩展转换有两条路径

byte-short-int-long-float-double

char-int-long-float-double

这两条路径中位于左边的类型都可以转换为右边的类型,不过源类型与目标类型的距离越近,则这种转化就越好。

3. 如果存在自动装箱和变长参数,则扩展转换的优先级大于自动装箱,自动装箱的优先级大于变长参数。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-29 11:27:16

Java-多态、方法重载的相关文章

Java多态特性:重载和覆写的比较

Java重载: 在同一个类中 方法具有相同的名字,相同或不同的返回值,但参数不同的多个方法(参数个数或参数类型) public class MethoDemo{ public static void main(String args[]){ int one = add(10,20) ; // 调用整型的加法操作 float two = add(10.3f,13.3f) ; // 调用浮点数的加法操作 int three = add(10,20,30) ; // 调用有三个参数的加法操作 Syst

Java笔记 —— 方法重载和方法重写

h2 { color: #4ABCDE } a { text-decoration: none !important } a:hover { color: red !important; text-decoration: underline !important } pre { border: solid 1px #CCCCCC; background-color: #F8F8F8; margin: 15px; overflow: auto; white-space: pre; font-siz

JAVA中方法重载,方法覆盖,方法继承等小结

1.方法重载(method overload)的具体规范 如果有两个方法的方法名相同,但参数不一致,哪么可以说一个方法是另一个方法的重载. 一.方法名一定要相同. 二.方法的参数表必须不同,包括参数的类型或个数,以此区分不同的方法体. 1.如果参数个数不同,就不管它的参数类型了! 2.如果参数个数相同,那么参数的类型或者参数的顺序必须不同. 三.方法的返回类型.修饰符可以相同,也可不同. 四.main方法也可以被重载

java 子类方法重载和重写区别

方法重写: * Override和Overload的区别?Overload能改变返回值类型吗? * overload可以改变返回值类型,只看参数列表 * 方法重写:子类中出现了和父类中方法声明一模一样的方法.与返回值类型有关,返回值是一致(或者是子父类)的 * 方法重载:本类中出现的方法名一样,参数列表不同的方法.与返回值类型无关. * 子类对象调用方法的时候: * 先找子类本身,再找父类.

java中方法重载是什么, 实际中到底有什么意义, 用处?请举例

7.3 方法重载(overload)  (视频下载) (全部书籍) 当几个方法有相同的方法名,但参数个数不同或参数类型不同时,就涉及方法重载 方法重载有什么意义呢?在公司里编程,有时候一个方法名,要用到很多次,而且每次跟每次的参数都不一样,而且这个方法名,特别适合某个业务(比如登录),这个时候你变成其他的方法名,对大家来讲都很别扭,这时候就用到重载的概念了. square(int i)和square(double d) 涉及方法重载. public class SquareDemo { publ

Java面向对象----方法重载

方法重载(over load):方法名相同,参数列表不同,返回类型无关 package com.tanlei.newer; public class OverLoadDemo { public static void main(String[] args) { Printer printer=new Printer(1000); printer.print("hello"); printer.print(12); printer.print("hello", 12)

JAVA面向对象 - 方法重载与覆盖

方法重载 方法重载就是在类的同种实现方式,到底采用哪种方式,取决与调用者给出的参数.方法重载特点是方法名相同,方法的参数类型,个数,顺序至少有一项不同,方法放回类型可以不同,方法的修饰符可以不同,只是放回类型不一样,不能构成重载 实例 1 package com.beekc.www; 2 3 public class Beekc { 4 public static void main(String[] args) { 5 Max c = new Max(); 6 System.out.print

JAVA基础-----方法重载

overload--方法重载 方法重载 1. 概念: 一个类中的一组方法 有相同方法的名字 不一样的参数列表 这样的一组方法 参数的不同体现在哪里? 参数的个数 参数的类型 参数的顺序 2. 作用:为了让使用者便于记忆与调用 只需要记录一个名字 执行不同的操作 3. 自己也可以设计重载 通过对象.方法名字 调用方法 可以直接通过方法的名字定位方法 如果方法名字一致 通过放的参数列表类型 来定位方法 如果没有与传递参数类型一致的方法,可以找一个参数类型可进行转化(自动):例如char 和 int

Java 多态,重载,重写

1.多态(polymorphism): 多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定.这就是多态性.多态性增强了软件的灵活性和扩展性. 简单来说:发送消息给某个对象,让该对象自行决定响应何种行为. 通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用. 多态须具备: a. 基类 和各个子类 b. 基

java中方法重载和递归调用

什么时候会发生方法的重载? 1.发生在同一个类中. 2.方法名相同 3.参数列表不同(类型,个数,顺序) 4.和返回值类型无关 5.和方法的修饰符列表无关. 递归调用:方法自己调用自己. 例如: public class A {     public int sum (int n)          if (n == 1){              return 1;          }else{              return n+sum(n-1);          } } 递归