Java SE 方法
1. 定义
-
方法:定义某种功能的代码段;
-
方法的作用:
- 简化代码的编写
- 提高代码的复用性
-
注意:
- 方法不调用不执行
- 方法不能嵌套,定义在类中方法外
2、格式
修饰符 返回值类型|void 方法名(参数列表){
实现功能的代码段;
[return 返回值;]
}
-
修饰符:public static 访问权限修饰符
-
返回值类型|void:
- 这个方法执行完毕之后,调用方法的位置是否要等到一个结果,一个值,如果是就定义成有返回值类型的方法,如果不是就定义成没有返回值类型的方法
- void : 没有返回值类型的方法
- 返回值类型 : 有返回值类型的方法
- 返回值类型可以为任意类型(基本数据类型|引用数据类型)
-
方法名: 标识符 方法的调用的根据方法名进行调
- 遵循标识符的规则或者规范
-
(参数列表): 可以有参数,可以没有参数,可以存在多个参数
- 方法在定义过程中有没有不确定的数据,未知的数据,有就定义在参数列表上
- 参数: 数据类型 参数名,数据类型 参数名…
- 方法的参数->相当于局部(当前方法内部)变量的声明,什么时候赋值,在调用方法的时候,方法的参数才有值
-
{ } : 实现工具具体的语句体代码段
-
return :
- 1.提前结束方法 (相当于循环中的break;)
- 2.在有返回值类型的方法中,必须存在,return 返回值,带出一个返回值
注意: 如果是有返回值类型的方法,方法体中必须配合return关键字一起使用,作用是带出返回值
3、定义方法步骤
- 方法的实现需求
- 方法的名字 : 见名知意
- 返回值|void: 这个方法执行完毕之后,调用方法的位置是否要等到一个结果,一个值
- 参数:方法在定义过程中有没有不确定的数据,未知的数据,有就定义在参数列表上
4、方法调用
:执行方法中的代码。
对象名.方法名(实际参数列表);
- 有返回值类型的方法:
- 1.输出调用 System.out.println(方法名(实参));
- 1)执行方法中的所有代码 2)打印方法的返回值
- 2.赋值调用 数据类型 变量名 = 方法名(实参);
- 1)执行方法中的所有代码 2)返回值赋值给一个变量
- 3.直接调用: 方法名(实参); ->得不到返回值
- 1.输出调用 System.out.println(方法名(实参));
5、实参与形参
-
形式参数 : 形参
- 定义方法时候()中的参数
-
实际参数 : 实参
- 在方法调用时实际传输给方法的数据,调用方法时候()中的参数
-
形参与实参之间要求一一对应
-
注意:
方法的形参相当于局部变量的声明,局部:当前方法方法的形参没有默认,形参的值由实参决定。
-
方法签名:方法名+参数列表 ->标识方法的唯一,相当于人的身份证号
6、实例
public class MethodDemo06 {
public static void main(String [] args){
//调用
System.out.println(getSum(3,5));;
int result = getSum(3,10);
System.out.println(result);;
clear();
}
//需求: 计算2个整数的和 int
//方法名: getSum
//返回值类型|void : 有返回值类型的方法 int->return
//参数: int a,int b
public static int getSum(int a,int b){
System.out.println("有返回值,有两个int参数的方法getSum");
return a+b;
}
//需求: 打扫全校卫生功能
public static void clear(){
System.out.println("李银桥打扫整个学校卫生!!!!");
}
}
7、return
-
1) 提前结束方法 2)带出返回值,返回给方法的调用处
-
在有返回值类型的方法中必须存在return关键,并且必须带出带出返回值
-
没有返回值类型的方法可以存在return,不能带出返回值,只能结束方法
public static void test2(int i){ //int a = 1;
if(i==5){
return; //提前结束方法
//System.out.println("return后面的语句");
}
System.out.println("i!=5");
}
//有返回值类型的方法
public static boolean test(int i){ //int a = 1;
if(i==5){
return false; //提前结束方法
//return false;
//System.out.println("return后面的语句");
}
System.out.println("i!=5");
return true;
}
8、不可达语句
- 1.return后面的语句
- 2.while–false中的代码
- 3.死循环后的代码 for( ; ; ){ } while(true){ }
- 4.break与continue的后面代码
public static void main(String [] args){
//欺骗编译器
boolean flag = false;
while(flag){
System.out.println("while--false的语句");
}
//死循环
/*
while(true){
}
for(;;){}
do{}while(true);
*/
for(int i=1;i<=10;i++){
if(i==5) {
break;
//System.out.println("while--true的语句");
}
}
long b = 1;
test((int)b);
int b2 = test1(1);
System.out.println(test2());
}
public static void test2(int i){ //int a = 1;
if(i==5){
return; //提前结束方法
//System.out.println("return后面的语句");
}
System.out.println("i!=5");
}
9、方法重载(overload)
-
1、方法的重载是指一个类中可以定义多个方法名相同但是形式参数不同的方法,调用时会根据不同的参数自动匹配对应的方法。
- 同一个类中的多个方法,相同的方法名,不同的参数列表->方法的重载
- 雷区:重载的方法,实际是完全不同的方法,只是名称相同罢了。
-
2、构成方法重载的三个条件:
- 同一个类中的多个方法
- 方法名相同
- 参数列表不同(方法签名不同)
- 参数的个数不同
- 参数的类型不同
- 不同类型的参数顺序不同
重载方法调用如何区分: 看调用方法时候的实参
-
3、 方法签名:
- 方法的唯一标识
- 方法签名 = 方法名+参数列表;
-
4、思考
1、方法的重载与返回值类型有没有关系?没有关系
如:int name(String str){} 与 double name(String str){} 不构成重载
2、方法的重载与修饰符有没有关系? 没有关系。
如:int name(int a1){} 与 int name(int a2){} 不构成重载
3、方法的重载与参数名有没有关系? 没有关系
如:name(int a,int b){} 与 name(int c,int d){} 是否构成重载?
10、递归
方法自己调用自己
-
建议:
- 不建议频繁大量使用
- 简单,使用不好有可能造成内存的溢出
-
递归头: 停止自己调用自己的条件
-
递归体: 自己调用自己
-
临界条件 : 停止自己调用自己的条件
-
递归前进段 : 自己调用自己直到临界条件的过程
-
递归后退段 : 从临界条件开始一直返回到调用的上一层
public static void main(String [] args){
//求5!阶乘 5*4*3*2*1
int result = 1;
for(int i=5;i>=1;i--){
result*=i;
}
System.out.println(result);
System.out.println(rec(5));
}
//需求: 实现求某一个数的阶乘
//参数: int i
//返回值: int
public static int rec(int i){
if(i==1){
return 1;
}
return i*rec(i-1);
}
//递归1到几相加
public static int f(int n){
if(n == 1)
return 1;
else
return n+f(n - 1);
}