函数

               ----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------

函数

 

定义函数:

1、什么是函数?

函数就是定义在类中的具有特定功能的一段独立小程序。函数也称为方法。

函数的格式:

 

修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,…)

{

执行语句;

return 返回值;

}

 

 

总结:

定义函数两个明确:

1:是否有未知内容参与运算

2:是否有运算结果(返回值)

案例:获取2个整数中的较大的数。

 

public static int getMax(int x, int y) {

        int result;

if (x > y) {

result= x;

} else {

result= y;

}

return  result;

}

解析:getMax方法

该方法方法名为:getMax,方法的作用是获取找出两个整数中较大的值。该方法有两个int型参数,:x和y,方法返回两个数中较大的一个。

注意: 函数定义详解

 

1) 返回值类型:获取两个整数较大值, 进行运算后的结果还是整数,所以返回值类型就是整数int。

2) 函数名:要遵循标识符的规则,而且名称要易读。定义为getMax。

3) 参数列表: 函数需要接受具体的数据参与运算,本方法中,要获取两个整数进行运算,就定义了两个int 类型变量用于接收调用者传递进来的数据.

4) 函数功能:在花括号中定义功能,本例需要实现的功能是获取较大的整数;

5) return result; 把运算结果result返回给调用者。

6) 修饰符号:例如 public static。 

 

 

方法定义完成之后,如何调用一个方法?

getMax功能在类中是独立存在的,运行这个类的时候该函数并不会运行,因为功能定义完了却

没有使用.如何使用该函数,直接在主函数中通过调用getMax;即可。

 

函数调用:

想要使用方法,必须调用它。

 

public static void main(String[] args) {

int max = getMax(5, 7);

System.out.println(max);

}

一:在main方法中调用getMax()方法,5和7就是给该方法传递的实际参数。如果方法有返回值,可以定义一个变量接收返回值,变量类型和方法返回值类型一致。本例中通过int类型变量max接收了getMax方法的返回值。

 

完整程序

这里的getMax(i, j); 变量i和j就是方法的实际参数。

 

public class Demo6 {

public static void main(String[] args) {

int i=5;

int j=7;

int max = getMax(i, j);

System.out.println(i+"和"+j+"的最大值是:"+max);

}

 

public static int getMax(int x, int y) {

        int result;

if (x > y) {

result= x;

} else {

result= y;

}

return  result;

}

}

二:上述案例中调用getMax方法,并将结果赋值给了max变量。也可以直接打印getMax()方法的结果。

 

public class Demo6 {

public static void main(String[] args) {

int i=5;

int j=7;

        //打印方法的结果

System.out.println(getMax(i, j));

}

 

public static int getMax(int x, int y) {

        int result;

if (x > y) {

result= x;

} else {

result= y;

}

return  result;

}

}

解析:

该类中包含了两个方法,main方法和getMax方法。main方法由java虚拟机调用,并且main方法的写法是固定的。main方法可以调用其他方法。

当调用getMax方法时,变量i的值传递给方法中的x,j的值传递给方法中的y,并开始执行getMax方法中的语句,执行return,并返回运算结果。getMax方法运行完毕。

 

总结: 程序的执行过程

1、主函数被虚拟机调用,

2、getMax(i,j)被执行,

3、程序就跳转到了getMax中运行,同时把变量i和j持有的值传递给了函数中的x和y .

注意:main方法是程序的入口由虚拟机调用,方法和方法之间不能嵌套,方法之间通过调用来使用。

方法什么时候执行完毕:

当执行完return语句,或者执行到方法末尾的花括号时方法结束。

 

知识拓展(以下是了解)

栈内存:

方法执行原理,每当调用一个方法时,系统都会将参数,局部变量存储在栈内存中,采用先进后出的方式存储数据,当一个方法调用另外一个方法时,调用者的栈空间保持不变,为新方法开辟空间。一个方法运行结束返回到调用者时,其相应的空间也被释放。

本例中java虚拟机调用main方法,为main方法在栈内存中开辟空间(进栈),main方法中有变量i=5 j=7 max,当调用了getMax方法,就为getMax方法开辟空间(栈内存)变量x,变量y 变量result,其中main方法的i和j的值传递给了x,y。getMax方法执行完毕后,将结果传递给了main方法的变量max。getMax方法运行完毕(出栈),getMax方法的空间就被释放掉。继续运行main方法。最后main方法运行完毕,main方法的栈空间被释放。

 

总结 其实就是将一部分可以复用的代码进行了封装,最主要特点就是可以被重复使用.这就是函数的功能.

 

 

 

 

 

 


1.1.1. 函数的特点

1) 定义函数将功能代码进行封装,通过函数提高代码复用性

2) 函数只有被调用才会被执行

3) 函数没有具体返回值时,返回值类型用关键字void表示,那么该函数中的return语句如果在最后一行可以省略不写。

4) return 关键字 用于返回值,用于结束函数。

 

注意:

函数中只能调用函数,不可以在函数内部定义函数。

错误写法

 

public static void main(String[] args) {

public static void getResult(int x) {

System.out.println(x * 8);

// 主函数,里边嵌套函数。错误!

}

}

 

函数的返回值void

需求:定义函数打印99乘法表:

分析: 该方法仅仅是在控制台输出信息没有具体的返回值,此时就可以使用void来定义方法的返回值类型.

该方法没有具体的返回值,那么返回值的类型 可以省略掉吗?当然不行,因为函数的格式要求有返回值类型.

当函数运算后, 没有具体的返回值时,这时返回值类型用一个特殊的关键字做标志.该关键字就是void void 表示没有具体的返回值类型. 当函数的返回值类型是void 时,函数中的return语句可以省略不写.

 

 

 

 

 

 

return 关键字 

用于返回值,用于结束函数。

 

public static void print(int a) {

if (a % 2 == 0) {

System.out.println(a + "是偶数");

} else {

System.out.println(a + "是奇数");

}

System.out.println("判断结束.....");

}

 

public static void print2(int a) {

if (a % 2 == 0) {

System.out.println(a + "是偶数");

return;

} else {

System.out.println(a + "是奇数");

}

System.out.println("判断结束.....");

}

 

 


1.1.2. 函数应用

1.判断2个数是否相同。

2.定义一个功能,用于打印矩形. rectangle

3.定义一个打印99乘法表功能的函数.

练习1

 

public static boolean equals(int x, int y) {

if (x == y) {

return true;

} else {

return false;

}

}

 

 

public static boolean equals2(int x, int y) {

return x == y;

}

 

 

 


1.1.3. 函数的重载(overload)

重载的概念

在同一个类中,允许存在一个以上的同名函数,只要它们的参数个数或者参数类型不同即可。

重载的特点:

与返回值类型无关,只看方法名和参数列表。

重载的好处:

方便于阅读,优化了程序设计。

重载示例:

返回两个整数的和

    int add(int x,int y){return x+y;}

返回三个整数的和

    int add(int x,int y,int z){return x+y+z;}

返回两个小数的和

    double add(double x,double y){return x+y;}

 

1需求:定义一个函数,实现两个整数的加法。

 

public static int add(int x, int y) {

return x + y;

}

 

调用

 

System.out.println(getSum(2,3)); /没有问题

System.out.println(getSum(2L,3L)); //编译报错

 

如何解决这个问题,显然add方法只能接受byte short int 和char类型的实际参数,可以再次再次定义add2(long x,long y)方法。

如果需要计算double 数的求和,需要再次定义 add3(double x,double y ) 方法

发现问题

如果要定义运算两个数的求和函数,由于数据类型的不同,可能需要定义对个方法,方法名可能是 getSum1 getSum2 … 等等.关键以后如何调用.怎么知道哪个方法接收的什么类型参数?

总结:如果没有函数重载技术,一个类中会有很多具备相同功能但方法名不同的函数,导致开发者在使用的时候要记住很多函数名。

函数的功能一样,仅仅是参与运算的未知内容不同时。

可以定义多函数,使用统一函数名称,这样方便阅读。

在调用时,虚拟机通过实际参数的不同来区分同名函数。

重载.单词overload 

在同一个类中,允许存在一个以上的同名函数,只要它们的参数个数或者参数类型不同即可。

范围 是同一个类中, 同名函数,就是函数名一样,那么函数名一样怎么区分呢,

那么只要他们的参数类型,参数个数不同.参数顺序。就是用这些来区分.

那么参数类型和参数个数是函数的哪一个部分呢.参数的定义发现就是函数名后括号中的内容.

所以重载只和参数列表有关系.

练习: 

定义一个加法运算,获取两个整数的和.

定义一个加法,获取三个整数的和.

 

public static void main(String[] args) {

getSum(5, 5);

getSum1(5, 6, 6);

}

 

// 定义一个加法运算,获取两个整数的和.

public static int getSum(int x, int y) {

return x + y;

}

 

// 定义一个加法,获取三个整数的和.

public static int getSum1(int x, int y, int z) {

return x + y + z;

}

 

那么在主函数中写getSum 使用 getSum ,写 getSum1 使用 getSum1  

发现这两个函数的功能的具体实现是一样的原理, 
函数的名称有什么用?是用于标识函数的。还有一个作用,就是通过函数的名称,体现函数的功能。

函数名称一定要有意义,就是要具有良好的阅读性.所以定义函数名重点在于体现函数的功能。

查看代码发现两个都是求和运算,那么定义了 getSum 和getSum1不是很合适。

虽然这样写没有问题,但是可以写的更好吗?

 

public static void main(String[] args) {

getSum(5, 5);

getSum(5, 6, 6);

}

// 定义一个加法运算,获取两个整数的和.

public static int getSum(int x, int y) {

return x + y;

}

// 定义一个加法,获取三个整数的和.

public static int getSum(int x, int y, int z) {

return x + y + z;

}

 

因为功能一致所以函数的名称就一致。那么函数名都叫getSum后还能区分吗?

是可以的,当调用 getSum(6,6);时就去找参数有两个整数的getSum 的方法,如果调用getSum(6,6,6); 那么自动去找对应的三个参数的方法。这些工作都是java虚拟机自动识别的。

如果传入一个参数的呢?肯定会失败,因为函数没有定义。.这就是getSum方法在类中出现了重载的形式,这就是java中的重载,名称保持一直,参数类型,参数个数不同。

   注意如果定义两个参数名称,参数列表一样的函数,那么这个就不是重载了,虚拟机是不认的.所以得用参数列表来区分。

 

 

 

 

练习 

/*

void show(int a,char b,double c){} 

a.

void show(int x,char y,double z){}//没有,因为和原函数一样。

b.

int show(int a,double c,char b){}//重载,因为参数类型不同。注意:重载和返回值类型没关系。

c.

void show(int a,double c,char b){}//重载,因为参数类型不同。注意:重载和返回值类型没关系。

d.

boolean show(int c,char b){}//重载了,因为参数个数不同。

e.

void show(double c){}//重载了,因为参数个数不同。

f.

double show(int x,char y,double z){}//没有,这个函数不可以和给定函数同时存在与一个类中。

 

*/

 

 

      ----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------

 

posted @ 2015-12-21 20:20  Monkyo  阅读(329)  评论(0编辑  收藏  举报