目录
一、方法定义
1.1 什么是方法(函数)?
Java方法是语句的集合,它们在一起执行一个功能。
- 方法是解决一类问题的步骤的有序组合
- 方法包含于类或对象中
- 方法在程序中被创建,在其他地方被引用
在前面几个章节中我们经常使用到 System.out.println()里:
- println() 是一个方法
- System 是系统类
- out 是标准输出对象
这句话的用法是调用系统类 System 中的 / 标准输出对象 out 中 / 的方法 println()。
1.2 为什么要使用方法?(优点)
- 1. 使程序变得更简短而清晰
- 2. 提高了代码的重用性
- 3. 有利于程序维护
- 4. 可以提高程序开发的效率
1.3 语法
修饰符 返回值类型 方法名 (参数类型 参数名)
{
方法体
return 返回值;
}
Java的方法/函数必须定义在类的内部,成为类的成员。方法包含一个方法头和一个方法体。
下面是一个方法的所有部分:
语法
1. 修饰符
(可选)告诉编译器如何调用该方法。定义了该方法的访问类型。在这个阶段,我们要在所有的函数的访问类型后面加上关键字“static”。static表示这个函数属于这个类,而不属于这个类的任何对象,因此我们才可以不制造这个类的对象,而直接从main()函数中调用它。
2. 返回值类型
函数的返回类型在函数定义时指定,可以是任何数据类型,如整数、浮点数、布尔值、字符串等。当函数执行完毕时,它会将计算结果返回给调用者,调用者可以选择将返回值存储在变量中或者直接使用。
在编程中,一个函数通常具有返回值。它在方法体中必须使用return语句返回一个值(函数计算后返回给调用者的结果);如果一个函数没有返回值,则称其为“无返回值函数”(返回类型void),在方法体中不需要使用return语句(只打印了一段文本,返回类型也是void)。
一个函数可以出现多个return,但是保持单一出口是较好做法。
3. 方法名
第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerson。
4. 参数类型
参数像是一个占位符。当方法被调用时,传递值给参数。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。多个参数定义用逗号’,’分隔。
5. 方法体
方法体包含具体的语句,定义该方法的功能。
1.4.1 【举例1】 (有无返回值)
用之前【数组2】里面的素数的例子(判断其是否能被已知的,且< num的素数整除)。
将这个判断程序变成方法时需要注意的地方:
有无返回值
1. 方法头:将整个判断素数的过程从 psvm里拿出来,放到上面。并增加一个方法头,与psvm是并列。
2. 返回值:这里这个方法没有返回值,因为只是打印了一段文本。
3. 调用函数:在 psvm 下面送入参数。比如,前100个素数。
1.4.2 【举例2】 (返回值存入变量)
在Java中,可以将数组作为函数的返回值来返回数组。具体的实现方法如下:
- 定义函数:在函数内部创建一个数组,并将其赋值。
- 调用函数:在主函数中调用时,将结果存储在数组变量 result 中,最后for/ for-each 输出结果。
改变举例1
返回值是数组
因为本身这个例子就是用数组将已经判断出来的素数存储起来的,所以改变成函数的时候,调用的时候,需要将结果存储进 result 。然后再用 for-each 读取。
再例如,假设我们需要返回一个长度为n的整型数组,代码实现如下:
public static int[] getArray(int n) { // 定义函数头,返回数组类型
int[] arr = new int[n];
for (int i = 0; i < n; i++) { // 赋值数组
arr[i] = i;
}
return arr;
}
public static void main(String[] args) {
int[] result = getArray(5); // 送参数,接收数组
for (int i = 0; i < result.length; i++) { // 读取数组
System.out.println(result[i]);
}
}
在上述代码中,getArray函数返回一个长度为n的整型数组。在函数内部,首先创建一个长度为n的整型数组isPrime,然后将其赋值(),并将数组作为返回值返回。在主函数中调用时,先将结果存储在数组变量 result 中,再用 for/ for-each 输出结果。
1.4.3 【举例3】 (返回值直接使用)
m 和 n 是输入进系统的数,计算 m-n之间所有素数之和。
将判断质数的部分转成函数 isPrime(i),返回值为 boolean 类型。在 psvm 里面调用函数结果,并直接使用(3)
返回值直接使用
二、函数调用
当一个函数被调用时,程序就转到这个函数中去运行,函数体里的语句就一条一条地被调用。函数知道每一次是哪里调用它,函数结束的时候会返回到正确的地方。
接收变量 = 函数名(参数1,参数2)
括号 () 起到了函数调用的重要作用,即使没有参数也要 () 。如果有参数,则需要给出正确的数量和顺序。这些值会被按照顺序依次用来初始化函数中的参数。可以传递给函数的值是表达式的结果,这包括:[1]字面量、变量、函数的返回值、计算的结果。
public static int max(int a, int b)
{
int ret;
if( a>b )
{
ret = a;
}
else
{
ret =b;
}
return ret;
}
public static void main(String[] args) {
int a =5;
int b =6;
int c ;
c = max(10,20); // 字面量
c = max(a,b); // 变量
c = max(max(c,a),5); // 函数的返回值(将上一个c再传给函数)
System.out.println(c);
max(12,13); // 直接丢弃
}
2.1 参数类型不匹配
函数期望的参数类型与调用函数时给的值的类型比较
1. 期望宽:编译器可进行类型转换。
char--> int --> double(如果函数需要参数类型是int ,你传入double是可以的)
2. 期望窄:强制类型转换 int 5.0
3. 无法转换: boolean 与 int 之间
2.2 参数的值的传递
Java语言在调用函数时,永远只能传值给函数。
下面的代码可以交换 a 和 b 的值吗?
public static void swap(int a, int b)
{
int t;
t = a;
a = b;
b = t;
}
public static void main(String[] args)
{
int a = 5;
int b = 6;
swap(a,b);
System.out.println(a + " "+ b); // 5 6
}
每个函数有自己的变量空间,参数也位于这个独立的空间中,和其他函数没有关系。
函数的里的叫参数,调用时,送进去的是值。
三、本地变量
函数每次运行,就产生一个独立的变量空间,在这个空间中的变量,是函数的这次运行所独有的,称作本地变量。
定义在函数内部的变量就是本地变量。
参数也是本地变量。
3.1 变量的生存期和作用域
生存期:变量什么时候出现,到什么时候消失
作用域:该变量需要在什么范围内进行访问(这个变量起作用的范围)
统一答案:大括号内(块)
3.2 本地变量的规则
A. 本地变量是定义在块内的:
1. 它可以是定义在函数的块内
2. 也可以定义在语句的块内
3. 甚至可以随便拉一对大括号来定义变量
4. 不能在一个块内定义同名的变量,也不能定义块外面定义过的变量
B. 程序运行进入这个块之前,其中的变量不存在,离开这个块,其中的变量就消失了。
C. 块外面定义的变量在里面仍然有效。
D. 本地变量不会被默认初始化。
E. 参数进入函数的时候被初始化了。
参考
- ^字面量是编程语言中用于表示固定值的标记或符号,它们的值是不可变的,不需要计算或处理。