深入java函数重载

深入java函数重载



先思考几个问题:

有这个一个重载的函数:

public static void chongZai1(ArrayList list){
    System.out.println("ArrayList ");
}
public static void chongZai1(AbstractList list){
    System.out.println("AbstractList ");
}

public static void chongZai1(List list){

    System.out.println("List ");
}

1.

 public static void main(String[] args) {
    List list = new ArrayList();
    chongZai1(list);

    ArrayList arrayList = new ArrayList();
    chongZai1(arrayList);
}

会如何输出?

输出 :
List
ArrayList



概念:
函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。

  • 函数的重载是一个编译期概念。
  • 编译时根据参数变量的类型判断应该调用哪个方法。

简单的理解就是

        List list = new ArrayList();
                chongZai1(list);

直接去找 参数为List类型的函数

    ArrayList arrayList = new ArrayList();
    chongZai1(arrayList);

先去找参数类型为 ArrayList 的方法 没有就去找参数为ArrayList父类的函数 最后才是找参数为Arraylist实现的接口的函数。



如果是这样重载的函数:

public static void chongZai1(AbstractList list){
    System.out.println("AbstractList ");
}

public static void chongZai1(AbstractCollection list){
    System.out.println("AbstractList ");
}

public static void chongZai1(List list){

    System.out.println("List ");
}
public static void chongZai1(Serializable list){

    System.out.println("List ");
}

 public static void main(String[] args) {

    ArrayList arrayList = new ArrayList();
    chongZai1(arrayList);
}

    这样编译期就会抛错!

    因为它不知道该去掉哪个方法 这些都是父的父类或者实现的接口

    集体规则 参考:[https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.5](https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.5)

原文地址:http://blog.51cto.com/5013162/2141172

时间: 2024-11-08 21:33:34

深入java函数重载的相关文章

Java学习3之成员方法及函数重载

方法的定义:方法名称,返回值,参数列表,修饰符(权限修饰符,final,static),实现体. 参考自:<Java 程序设计与工程实践> 方法的签名: 唯一区别其他方法的元素:(1)方法名称:(2)参数类型列表(参数顺序和类型).这就是方法的签名. 方法的签名不包括方法的返回值.虽然每个重载方法可以有不同的返回类型,但返回类型并不足以区分所使用的是哪个方法. example:(1)public void on(){} public int on(){};这样两个方法编译器依然认为是相同的方法

Java自学笔记(第三天)-while循环-do while循环-for循环-函数-函数重载

(1)while循环,do while循环:的区别,while是先判断条件,再执行语句. do while是先执行一遍语句,再判断条件. while(循环条件表达式){                do{ 执行语句:                           执行语句: }                                              }while(循环条件表达式); (2)for循环: for(初始化表达式:循环条件表达式:循环后的操作表达式){ 执行语

Java 构造函数和函数重载

构造函数:⑴方法名和类名相同,而且没有返回类型(包括 void 也没有): ⑵没有返回值: ⑶如果没有输入构造函数,jvm会自动帮我们创建一个不带参数,没有任何函数体的的构造函数: 如果我们手动的创建了其他构造函数,就不会帮我们创建这个不带参数的构造函数了: ⑷一般情况下,如果想要实现自己的构造方法,最好重载一个不带参数的构造方法. 函数重载:指多个函数可以使用同一个函数名,只要它们参数列表不同,将意义相近的函数,命名为相同的名称. 重载总结:⑴函数重载是指多个函数使用同一个名称: ⑵重载的条件

java函数的重载

函数重载:对于一个类中的函数,函数名相同,参数不相同,我们将它的关系称为重载 参数不同的形式:个数不同 类型不同 原因:在程序内部 真正去识别函数的时候  识别的是函数名+所有参数的类型 注意点:重载的函数本质上是不同的函数 总结: 1.函数名必须相同 2.参数必须不同:个数 类型 位置  不同 就构成重载关系 3.重载与返回值没关系 public static int sum(int a,int b){ return 5; } public static int sum(int b,int a

初学JAVA函数

  函数是定义在类中的具有特定功能的小程序,函数也称为方法(将功能代码封装,便于对该功能进行服用,只有被调用施才会被执行) 静态函数所调用的被调用函数也必须是静态. 格式: 修饰符返回值类型函数名(参数类型形式参数1,参数类型形式参数2) { 执行语句: Return 返回值: } 特殊情况:功能没有返回值时,return的后面直接用分号结束,因为没有具体返回值,所以此时的返回值类型用void来表示. 函数提高了代码的复用性. class test617 {        public stat

C++基础补遗篇—函数重载与Extern C

问题引出 之前提到C存在命名冲突问题,新的C++专门为此引入了namespace机制加以改进(后文介绍),此外还有另一种机制: int add(int i, int j) {    return i+i;  } float add(float a, float b, floatc)  {    return a+b+c;   } void main() { int a = add(8, 9); float b = add(7.7, 8.8, 9.9); } 上例在C环境下不成立,因为C编译器不允

PHP函数重载的技巧实例

php 作为一种弱类型语言,本身不能像强类型如java ,c++那样,直接的实现重载. 可以通过一些方法,间接实现函数重载. 1,可以使用func_get_args()和func_num_args()这两个函数实现函数的重载.PHP代码: function rewrite() { $args = func_get_args(); if(func_num_args() == 1) { func1($args[0]); } else if(func_num_args() == 2) { func2(

5 Java 函数

/* 函数(方法):  函数的作用: 提高功能代码的复用性. 需求:做两个数的加法功能. 目前存在的问题:以下的代码都是在做一个加法功能,而 这里加法功能的代码目前是没有任何的复用性的. 解决方案: 如果一个功能的代码要被复用起来,那么这时候可以把 这里的功能代码封装起来,在java中把功能代码封装起来的是以函数的形式体现的. 函数的定义格式: 修饰符  返回值类型  函数名(形式参数..){ 需要被封装的功能代码: return 结果; } 分析函数: public static int ad

Swift函数重载

1.函数重载的概念 函数的重载指的是多个函数享有相同的名字都是有不同的参数或返回值类型不同,它们互相成为重载关系, 2.与其它语言的不同 Swift函数的参数类型包含了参数列表类型和返回值类型,例如(Double,Double)->Double 是由2个Double类型参数列表和Double类型的返回值类型构成,也就是说Swift中函数名相同,参数列表不同或者返回值类型不同的函数都可以构成重载,而在C++或者JAVA中,函数的重载只是与参数列表有关系,与返回值没有关系 3.示例 func rec