----------- 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学习型技术博客、期待与您交流! ------------