A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

多谢大家啊

评分

参与人数 1技术分 +1 收起 理由
陈涛 + 1

查看全部评分

7 个回复

正序浏览
何建华 黑马帝 2011-11-24 00:02:51
8#
本帖最后由 何建华 于 2011-11-24 00:07 编辑

     函数重载就是方法重载,定义:一般在同一个类中,方法名相同,并且方法的参数的个数不同或者对应位置上的类型不同,才能构成方法的重载
当方法的参数个数、顺序、类型不一致时就可以构成重载。
看个简单的例子
Console.WriteLine();
Console.WriteLine(123);
Console.WriteLine("abc");
当我们打印这些结果的时候并不会出错
比如最常见的Console.WriteLine();就由多达19种重载方法
可构成方法重载的情况举例:
1. 参数个数不相同
例如:
public static int Max(int i1, int i2)
        {
            ...
        }
        public static int Max(int i1, int i2, int i3)
        {
           ...
        }
2. 顺序不同
        public static int Max(int i1, int i2)
        {
            ...
        }
       public static int Max(int i2, int i1)
        {
            ...
        }
3. 类型不同
例如:
       public static int Max(int i1, int i2)
        {
            ...
        }
       public static double Max(double i1, double i2)
        {
            ...
        }

这样我们就可以调用Max方法时既可以输入小数又可以输入整数而不会出错

返回值的是否相同不可以作为方法重载的判断条件,当返回值不相同时,还是不能构成重载,例如
      public static double Max(double i1, double i2)
        {
            ...
        }
        public static void Max(double i1, double i2)
        {
            ...
        }
若你此时需要传入字符串时,方法Max不知道该调用哪个,所以就出错了





评分

参与人数 1技术分 +2 收起 理由
李荣壮 + 2

查看全部评分

回复 使用道具 举报
许前刚 黑马帝 2011-11-23 11:13:06
7#
我自己的解释:函数重载就是相同的函数名具有不同的参数,参数的类型和个数不同!比如在程序中用代码对数据库中的一个表进行查询时,可以用同一个函数名,但可以有不同的参数,有时按照ID查询,有时按照姓名查询等等!

评分

参与人数 1技术分 +1 收起 理由
李荣壮 + 1

查看全部评分

回复 使用道具 举报
关于判断两个名字相同的函数是否是重载的条件
(1)参数个数不同
(2)参数的类型不同,如果是多个参数,则只要有一个参数的类型不一样就可以了
切记:在判断函数重载的时候不管返回值
这两个条件只要满足一个就可以了

评分

参与人数 1技术分 +1 收起 理由
陈涛 + 1

查看全部评分

回复 使用道具 举报
重载就是允许你使用相同的方法名定义一个方法的多个版本。
是为了多次重新定义一个方法,以便你可以使用相同的方法名,但是参数的数量和类型不同。

评分

参与人数 1技术分 +1 收起 理由
陈涛 + 1

查看全部评分

回复 使用道具 举报
函数重载就是两个或两个以上的函数具有相同的函数名,但形参的个数和类型不同,这就是函数重载
例如:以下是参数类型不同的重载
sum(int a,int b)
sum(double a,double b)

以下是参数个数不同的重载:
sum(int a,int b)
sum(int a,int b,int c)

评分

参与人数 1技术分 +1 收起 理由
陈涛 + 1

查看全部评分

回复 使用道具 举报
方法重载指南
当类包含两个名称相同但签名不同的方法时发生方法重载。本节提供一些使用重载方法的指南。   
用方法重载来提供在语义上完成相同功能的不同方法。   
使用方法重载而不是允许默认参数。默认参数的版本控制性能不好,因此公共语言规范   (CLS)   中不允许使用默认参数。下面的代码示例阐释重载的   String.IndexOf   方法。   
[Visual   Basic]
Function   String.IndexOf(name   As   String)   As   Integer
Function   String.IndexOf(name   As   String,   startIndex   As   Integer)   As   Integer
[C#]
int   String.IndexOf   (String   name);
int   String.IndexOf   (String   name,   int   startIndex);
正确使用默认值。在一个重载方法系列中,复杂方法应当使用参数名来指示从简单方法中假定的默认状态发生的更改。例如,在下面的代码中,第一个方法假定搜索将不区分大小写。第二个方法用名称   ignoreCase   而不是   caseSensitive   来指示正在如何更改默认行为。   
[Visual   Basic]
'   Method   #1:   ignoreCase   =   false.
Function   Type.GetMethod(name   As   String)   As   MethodInfo
'   Method   #2:   Indicates   how   the   default   behavior   of   method   #1   
'   is   being   changed.
Function   Type.GetMethod(name   As   String,   ignoreCase   As   Boolean)   As   MethodInfo
[C#]
//   Method   #1:   ignoreCase   =   false.
MethodInfo   Type.GetMethod(String   name);   
//   Method   #2:   Indicates   how   the   default   behavior   of   method   #1   is   being   //   changed.
  MethodInfo   Type.GetMethod   (String   name,   Boolean   ignoreCase);
对方法参数使用一致的排序和命名模式。提供一组重载方法,这组重载方法带有递增数目的参数,以使开发人员可以指定想要的级别的信息,这种情况很常见。您指定的参数越多,开发人员就可指定得越详细。在下面的代码示例中,重载的   Execute   方法具有一致的参数顺序和命名模式变体。每个   Execute   方法变体都对共享的参数集使用相同的语义。   
[Visual   Basic]
Public   Class   SampleClass
      Private   defaultForA   As   String   =   "default   value   for   a "
      Private   defaultForB   As   Integer   =   "42 "
      Private   defaultForC   As   Double   =   "68.90 "
            
      Overloads   Public   Sub   Execute()
            Execute(defaultForA,   defaultForB,   defaultForC)
      End   Sub
            
      Overloads   Public   Sub   Execute(a   As   String)
            Execute(a,   defaultForB,   defaultForC)
      End   Sub
            
      Overloads   Public   Sub   Execute(a   As   String,   b   As   Integer)
            Execute(a,   b,   defaultForC)
      End   Sub
            
      Overloads   Public   Sub   Execute(a   As   String,   b   As   Integer,   c   As   Double)
            Console.WriteLine(a)
            Console.WriteLine(b)
            Console.WriteLine(c)
            Console.WriteLine()
      End   Sub   
End   Class
[C#]
public   class   SampleClass
{
      readonly   string   defaultForA   =   "default   value   for   a ";
      readonly   int   defaultForB   =   "42 ";
      readonly   double   defaultForC   =   "68.90 ";
      
      public   void   Execute()
      {
            Execute(defaultForA,   defaultForB,   defaultForC);
      }
                        
      public   void   Execute   (string   a)
      {
            Execute(a,   defaultForB,   defaultForC);
      }
                  
      public   void   Execute   (string   a,   int   b)
      {
            Execute   (a,   b,   defaultForC);           
      }
      
      public   void   Execute   (string   a,   int   b,   double   c)
      {
            Console.WriteLine(a);
            Console.WriteLine(b);
            Console.WriteLine(c);
            Console.WriteLine();
      }   
}
请注意,组中唯一的虚拟方法应该是具有大多数参数的方法,并且只应在需要可扩展性时才应有虚拟方法。   
如果必须提供重写方法的能力,请仅使最完整的重载是虚拟的并根据它来定义其他操作。下面的示例阐释了这种模式。   
[Visual   Basic]
Public   Class   SampleClass
      Private   myString   As   String
      
      Public   Sub   New(str   As   String)
            Me.myString   =   str
      End   Sub
      
      Overloads   Public   Function   IndexOf(s   As   String)   As   Integer
            Return   IndexOf(s,   0)
      End   Function
      
      Overloads   Public   Function   IndexOf(s   As   String,   startIndex   As   
                        Integer)   As   Integer
            Return   IndexOf(s,   startIndex,   myString.Length   -   startIndex)
      End   Function
      
      Overloads   Public   Overridable   Function   IndexOf(s   As   String,   
                        startIndex   As   Integer,   count   As   Integer)   As   Integer
            Return   myString.IndexOf(s,   startIndex,   count)
      End   Function   
End   Class
[C#]
public   class   SampleClass
{
      private   string   myString;

      public   MyClass(string   str)
      {
            this.myString   =   str;
      }
      
      public   int   IndexOf(string   s)   
      {
            return   IndexOf   (s,   0);
      }

      public   int   IndexOf(string   s,   int   startIndex)   
      {
            return   IndexOf(s,   startIndex,   myString.Length   -   startIndex   );
      }

      public   virtual   int   IndexOf(string   s,   int   startIndex,   int   count)   
      {
            return   myString.IndexOf(s,   startIndex,   count);
      }
}
带有可变数目的参数的方法
您可能希望公开带可变数目的参数的方法。C   编程语言中的   printf   方法是一个经典的示例。对于托管类库,请对此构造使用   params(Visual   Basic   中为   ParamArray)关键字。例如,使用以下代码代替几个重载的方法。
[Visual   Basic]
Sub   Format(formatString   As   String,   ParamArray   args()   As   Object)
[C#]
void   Format(string   formatString,   params   object   []   args)
不应以独占方式使用   VarArgs   或省略号   (...)   调用约定,公共语言规范不支持它。
对于极度性能敏感的代码,您可能希望为少量元素提供特殊代码路径。只有在打算将整个代码路径作为特殊情况处理(而不只是创建数组和调用更为通用的方法)时才可以这么做。在这种情况下,建议使用下面的模式来在性能和特殊处理的代码的成本之间进行协调。
[Visual   Basic]
Sub   Format(formatString   As   String,   arg1   As   Object)
Sub   Format(formatString   As   String,   arg1   As   Object,   arg2   As   Object)

Sub   Format(formatString   As   String,   ParamArray   args()   As   Object)
[C#]
void   Format(string   formatString,   object   arg1)
void   Format(string   formatString,   object   arg1,   object   arg2)
      
void   Format(string   formatString,   params   object   []   args)

引用CSDN....
回复 使用道具 举报
函数重载简单来说:就是考虑到函数参数可能会调用各种不同数据类型的实参时,那么对应各种不同的实参都需要相应的实现方法;

那么在函数调用了实参后,那么编译器就会根据实参 自动选择相应重载函数;

评分

参与人数 1技术分 +1 收起 理由
陈涛 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马