Java的函数与函数重载
关于Java的函数与函数重载
关于Java的函数与函数重载
1. 函数
假设有一个游戏程序,程序在运行过程中,要不断地发射炮弹。发射炮弹的动作都需要使用一段百行左右的程序代码,在每次发射炮弹的地方都要重复加入这一段百行程序代码,程序会变得非常臃肿,可读性也会变差。假如要修改发射炮弹的程序代码,需要修改每个发射炮弹的地方,很可能就会发生遗漏。几乎所有的编程语言中都要遇到这个问题,各种编程语言都将发射炮弹的程序代码从原来的主程序中单独拿出来,做成一个子程序,并为这个子程序安排一个名称,在主程序中需要使用到子程序的功能的地方,只需要写上子程序的名称就行了,计算机便会去执行子程序中的程序代码,当子程序中的代码执行完后,计算机又会回到主程序中接着往下执行。在Java中,这种子程序叫函数。
为了使程序各部分能够充分独立、任务单一、程序清晰、易懂易读易维护,常常是要根据所要完成的功能,将程序划分为一些相对独立的部分,每一个部分用一个函数来完成。 
例:程序在窗口上打印出3个由*组成的矩形 
程序清单:Func1.java
public class Func1
{
   public static void main(String[] args)
   {
   //下面是打印出第一个矩形的程序代码
   for(int i=0;i<3;i++)
   {
      for(int j=0;j<5;j++)
      {
         System.out.print("*");
      }
      System.out.println();//换行
   }
   System.out.println();
   //下面是打印出第二个矩形的程序代码
   for(int i=0;i<2;i++)
   {
      for(int j=0;j<4;j++)
      {
         System.out.print("*");
      }
      System.out.println();
   }
   System.out.println();
   //下面是打印出第三个矩形的程序代码
   for(int i=0;i<6;i++)
   {
      for(int j=0;j<10;j++)
      {
         System.out.print("*");
      }
      System.out.println();
   }
   System.out.println();
   }
}
运行后发现, 
 
上面程序中的每一段打印出矩形的代码,除了宽度和高度不一样,其他地方都一样。我们可以把打印出矩形的代码作为子程序单独从程序中提出来,并用一个“名称”来标记这段代码,以后再碰到要打印这种矩形的时候,直接调用这个“名称”就可以了。 
程序清单:Func2.java
oublic class Func2
{
   public static void drawRectangle(int x,int y)
   {
      for(int i=0;i<x;i++)
      {
         for(int j=0;j<y;j++)
         {
            System.out.print("*");
         }
         System.out.println();//换行
      }
      System.out.println();
   }
   public static void main(String[] args)
   {
      drawRectangle(3,5);
      drawRectangle(2,4);
      drawRectangle(6,10);
   }
}
上面的这段代码中,提出的这段代码就是函数体,用来标记这段代码的“名称”(drawRectangle),就是函数名,函数名和函数体共同组成了函数,在Java中,我们也称之为方法。这个函数需要接受两个整数类型的参数,一个是矩形的宽度,一个是矩形的高度。有时候一个求解矩形面积的函数就要返回一个代表面积的结果,函数的返回结果都是有类型的。所以一个函数的定义必须由三个部分组成,
返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,……)
{
   程序代码
   return 返回值;
}
- 像上面打印矩形的函数,不用 返回任何结果,那么我们就用void作为返回值类型,意思是说“不知道是什么类型,但定义函数时又非要填写一个返回值类型,那么就用void充数。”
 
下面再来看看一个求矩形面积的函数,来了解一下函数有返回值的情况 
程序清单:Func3.java
public class Func3
{
   public static int getArea(int x,int y)
   {
      return x*y;
   }
   public static void main(String[] atgs)
   {
      int area-getArea(3,5);
      System.out.println("first Acreage is "+area);
      System.out.println("second Acreage is "+gerArea(2,4));
      getArea(6,10);
   }
}
在上面的getArea函数中,用到了一个”return(返回值)”的语句,用于终止函数的运行并返回该函数的结果给调用者。上例中,函数调用的几种方式: 
(1)如果函数没有返回值或调用程序不关心函数的返回值,可以用下面的格式调用定义的函数: 
函数名(实参1,实参2,……) 
如上面的getArea(6,10);语句 
(2)如果调用程序需要函数的返回结果,则用下面的格式调用定义的函数: 
变量=函数名(实参1,实参2,……) 
如上面的int area=getArea(3,5);语句 
(3)对于有返回值的函数调用,也可以在程序中直接使用返回的结果,如: 
System.out,println(“second Acreage is “+getArea(2,4)); 
我们还可以在函数中使用return语句提前返回,如打印矩形面积的函数,首先应该检查传入的参数(即宽度和高度)是否为负数,为负则提前返回。修改上面的Func3.java, 
程序清单:Func4.java
public class Func4
{
  public static int getArea(int x,int y)
  {
     if(x<=0|y<=0)
     return -1;
     return x*y;
  }
   public static void main(String[] args)
   {
      int area=getArea(3,5);
      System.out.println("first Acreage is "+area);
      System.out.println("second Acreage is "+getArea(2,4));
      getArea(6,10);
   }
}
这样的程序对传入的参数值进行了检查控制,这也是软件编码规范中的一个起码要求。
2. 函数的参数传递过程
 
Java程序运行时虚拟机会先找到这个程序的main函数,接着从main函数里面取出一条条代码来执行,以上面的Func4.java 
为例,当执行到int area=getArea(3,5);这个语句时,程序会跳转到getArea(int x,int y)这个函数的内部去执行,先把实参(3,5)分别赋值给形式参数(int x,int y),然后返回x*y的结果(return x*y;),接着回到main里面,把结果赋值给整型变量area,这就是函数的参数传值的整个过程。
- 形式参数x和y就相当于函数getArea中定义的两个局部变量,在函数被调用时创建的,并以传入的实参作为初始值,函数调用结束时,也就被释放了,不会影响到主程序中的其他x和y(如果有的话),因为它们属于不同作用域中的变量,它们是互不相干的变量。
 
3. 函数的重载
函数的重载就是在同一个类中允许同时存在一个以上的同名函数,只要它们的参数个数或类型不同即可。在这种情况下,该函数就叫被重载(overloaded)了,这个过程称为函数的重载(method oerloading)。 
程序清单:Test.java
public class Test
{
   public static void main(String[] args)
   {
      int isum;
      double fsum;
      isum=add(3,5);
      isum=add(3,5,6);
      fsum=add(3.2,6.5);
   }
   public static int add(int x,int y)
   {
      return x+y;
   }
   public static int add(int x,int y,int z)
   {
     return x+y+z;
   }
   public static double add(double x,double y)
   {
      return x+y;
   }
}
Java的编译器能够根据调用函数时所传递的参数的个数和类型选择相应的函数。重载函数的参数列表必须不同,要么是参数的个数不同,要么是参数的类型不同。重载函数的返回值类型可以相同,也可以不同。
Java的函数与函数重载的更多相关文章
- Java之--Java语言基础组成—函数
		
Java语言基础组成-函数 Java语言由8个模块构成,分别为:关键字.标识符(包名.类名.接口名.常量名.变量名等).注释.常量和变量.运算符.语句.函数.数组. 本片主要介绍Java中的函数,函数 ...
 - js函数的伪重载
		
这也是今天写东西是遇到的一个问题,导致我联想起了函数重载的问题. 在javascript中是没有函数重载机制的,对于用惯了java开发的同学可能就表示吃惊了,我屮艸芔茻,函数 没有重载?那怎么搞?!! ...
 - Java 语言基础之函数
		
函数的定义: 函数就是定义在类中的具有特定功能的一段独立小程序 函数也称为方法 函数定义格式: 修饰符 返回值类型 函数名(参数类型 形式参数1, 参数类型 形式参数2,...) { 执行语句; re ...
 - JAVA基础语法:函数(方法)、类和对象(转载)
		
4.JAVA基础语法:函数(方法).类和对象 函数 在java中函数也称为方法,是一段具备某种功能的可重用代码块. 一个函数包括这几部分: 函数头 函数头包括函数访问修饰符,函数返回值类型, 函数名, ...
 - c++ 继承 虚函数与多态性 重载 覆盖 隐藏
		
http://blog.csdn.net/lushujun2011/article/details/6827555 2011.9.27 1) 定义一个对象时,就调用了构造函数.如果一个类中没有定义任何 ...
 - 你好,C++(28)用空间换时间 5.2 内联函数 5.3 重载函数
		
5.2 内联函数 通过5.1节的学习我们知道,系统为了实现函数调用会做很多额外的幕后工作:保存现场.对参数进行赋值.恢复现场等等.如果函数在程序内被多次调用,且其本身比较短小,可以很快执行完毕,那么 ...
 - (转)Java程序利用main函数中args参数实现参数的传递
		
Java程序利用main函数中args参数实现参数的传递 1.运行Java程序的同时,可以通过输入参数给main函数中的接收参数数组args[],供程序内部使用!即当你在Java命令行后面带上参数,J ...
 - Java中的回调函数学习
		
Java中的回调函数学习 博客分类: J2SE JavaJ# 一般来说分为以下几步: 声明回调函数的统一接口interface A,包含方法callback(); 在调用类caller内将该接口设置 ...
 - java中string.trim()函数的使用
		
java中string.trim()函数的的作用是去掉字符串开头和结尾的空格,防止不必要的空格导致的错误. public static void main(String arg[]){ String ...
 
随机推荐
- 一个tabBarController管理多个Storyboard
			
随着项目的业务逻辑越来越复杂,随着项目越来越大,那么我们Storybard中得控制器就越来越多, 就越来越难以维护.然而使用Storyborad又能更方便的帮助我们做屏幕适配(PS:尤其在6.6+出来 ...
 - 斯坦福IOS开发第五课(第一部分)
			
转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/27706991 作者:小马 因为第五课的内容比較多.分两部分来写. 一 屏幕旋转基本 ...
 - [Phonegap+Sencha Touch] 移动开发36 Phonegap/Cordova项目的图标和启动画面(splashscreen)配置
			
原文地址:http://blog.csdn.net/lovelyelfpop/article/details/40780111 Phonegap/Cordova项目中的config.xml文件.里面配 ...
 - java日期处理 calendar 和date
			
抄的人家的,仅作学习使用. java Date获取 年月日时分秒 package com.util; import java.text.DateFormat; import java.ut ...
 - 在 IIS  中配置 ASP.NET 应用程序
			
注意事项: 1.注册.NET 如果先安装.net平台,后安装IIS,那么在IIS中可能就没有出现ASP.NET版本的下拉菜单,就要手动注册: 一般.Net版本都存放在:C:\WINDOWS\Micr ...
 - OCP prepare 20140701
			
1. rman的完全备份,和不完全备份 Oracle 数据库可以实现数据库不完全恢复与完全恢复.完全恢复是将数据库恢复到最新时刻,也就是无损恢复,保证数据库无丢失的恢复.而不完全恢复则是根据需要特意将 ...
 - 通过url给action传中文参数乱码解决方案
			
比如: http://localhost:8080/projectName/dutyCondition.action?admitstate=0¤tStep=我的博客 传到后台的时候 ...
 - 在VHDL中,“传输延迟”和“惯性延迟”
			
传输延迟就是最容易理解的从输入变化到输出变化之间的延迟.对应语法是transport例如 b <= transport a after 20ns 惯性延迟考虑了电容效应,即如果输入是(相对)窄的 ...
 - Java判断字符串是否为空的三种方法
			
方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低.1: if(s == null || s.equals("")); 方法二: 比较字符串长度, 效率高, 是我知道的最 ...
 - powerpc e500系列,linux初始化的tlb汇编,添加人肉代码注释
			
powerpc e500的内核启动,关于tlb的初始化可以说是重头戏.看懂这段代码后,powerpc的虚实映射基本不在话下. 这段初始化tlb要考虑的,主要是将boot可能初始化过的tlb全清零,然后 ...