Rss & SiteMap

课外天地 李树青 http://www.njcie.com

李树青 论坛 南京 财经 课外天地
共7 条记录, 每页显示 10 条, 页签: [1]
[浏览完整版]

标题:课件7下载——Java函数

1楼
admin 发表于:2006/2/26 21:25:33

Java函数

函数能够将功能相近的代码封装成一个可以复用的模块。

1、定义
一般的函数需要考虑以下内容:返回值类型、函数名称和形参。
如有一个函数,功能为在屏幕上直接输出一个字符串“Hello”,函数的原型为:
void func()
{
        System.out.println("Hello");
}

如有一个函数,接受一个字符串变量,将其在屏幕上输出,函数原型为:
void func(String str)
{
        System.out.println(str);
}

如有一个函数,接受两个整型变量,返回它们的最大值,函数原型为:
int func(int a,int b)
{
        if(a>b)
                return a;
        else
                return b;
}
或者为:
int func(int a,int b)
{
        if(a>b)
                return a;
        return b;
}
或者为:
int func(int a,int b)
{
        return (a>b)?a:b;
}

2 使用
函数的使用很简单,只需直接以函数名称调用即可,如函数有形参则可以将实参赋过去,如函数没有参数,括号也不能省略。如:
public class exec
{
        public static void main(String[] args)
        {
                System.out.println(func(1,2));
        }
        
        public static int func(int a,int b)
        {
                return (a>b)?a:b;
        }
}
说明:如果一个函数需要被main主函数调用,需要在前面加上public static(个中原因以后再说)。

对于具有引用类型参数的函数而言,调用后将有可能产生实参的改变。
如:
public class exec
{
        public static void main(String[] args)
        {
                int i=0;
                func(i);
                System.out.println(i);
        }
        
        public static void func(int num)
        {
                num=1;
        }
}
输出为0,表明基本类型的参数不会发生形参的改变导致实参的改变

再如:
public class exec
{
        public static void main(String[] args)
        {
                int[] narray=new int[10];
                narray[0]=0;
                func(narray);
                System.out.println(narray[0]);
        }
        
        public static void func(int[] num)
        {
                num[0]=1;
        }
}
输出为1,表明引用类型的参数会发生形参的改变导致实参的改变,主要原因在于参数的传递内容其实是对象变量的引用,而非对象本身,所以会导致形参引用变量和实参引用变量指向同一个对象变量。

3、函数重载
下面程序的功能是实现多种函数,分别对不同类型的变量求最大值
public class exec
{
        public static void main(String[] args)
        {
                System.out.println(ifunc(1,2));
                System.out.println(dfunc(1.0,2.0));
        }
        
        public static int ifunc(int a,int b)
        {
                return (a>b)?a:b;
        }
        
        public static double dfunc(double a,double b)
        {
                return (a>b)?a:b;
        }
}

虽然结构清晰,但是函数调用的时候不太方便,需要指定不同的函数名称。在Java中完全可以将上述的两个自定义函数设计成同一个名称,但是参数不一样,此时称为函数重载,如:
public class exec
{
        public static void main(String[] args)
        {
                System.out.println(func(1,2));
                System.out.println(func(1.0,2.0));
        }
        
        public static int func(int a,int b)
        {
                return (a>b)?a:b;
        }
        
        public static double func(double a,double b)
        {
                return (a>b)?a:b;
        }
}

注意:
重载的条件只有下面几种:
1)参数个数不一样,或者参数有无
2)参数类型不一样,或者类型顺序不一样
下面不能成为重载的条件:
1)参数的名称不一样
2)函数的返回类型不一样

有时存在隐式类型转换,会导致调用情况复杂,如:
public class exec
{
        public static void main(String[] args)
        {
                System.out.println(func(1,2.0));
        }
        
        public static int func(int a,int b)
        {
                return (a>b)?a:b;
        }
        
        public static double func(double a,double b)
        {
                return (a>b)?a:b;
        }
}
输出为:2.0
说明:当有多种重载函数可以匹配时,系统总是采用从低精度类型向高精度类型转换的方式来选择重载函数。

[此贴子已经被作者于2010-12-12 07:34:25编辑过]
2楼
eva 发表于:2007/3/19 22:31:59
老师,这个“2)函数的返回类型不一样”可以作为不能成为重载的条件吗?你上面的例子不是一个返回int,一个返回double吗?
3楼
admin 发表于:2007/3/20 6:31:16

函数的返回类型不一样不可以作为重载的条件

上述两个函数虽然返回类型不一样,但是重载实际依据的是参数类型的不同,如果你将两个函数的参数类型改为一样,编译就会报错

4楼
eva 发表于:2007/3/20 22:09:12

那这两个条件不是相互矛盾吗?

5楼
admin 发表于:2007/3/22 20:07:26

为什么矛盾?

返回类型和参数并不是一个概念

6楼
eva 发表于:2007/3/22 21:47:54
虽然不是一个概念,但是它们必须同时满足吧?
7楼
admin 发表于:2007/3/25 23:12:12
不是,根本不必考虑返回类型对重载的影响,重载只与参数有关
共7 条记录, 每页显示 10 条, 页签: [1]

Copyright ©2002 - 2016 课外天地.Net
Powered By Dvbbs Version 8.3.0
Processed in .03125 s, 2 queries.