Day06
方法
何谓方法
System.out.println() 语句中 System属于是类,out是其中的输出对象,而println就是其中的方法。
相当于调用系统中System类中的输出对象out中的println方法。
Java方法是语句的集合,他们在一起执行一个功能。
方法是解决一类问题的步骤的有序组合
方法包含于类或者对象中
方法在程序中被创建,在其他地方被引用
设计原则:方法的本意是功能块,就是实现某个功能的语句块的集合。我们设计方法的时候,最好保持方法的原子性,就是一个方法只完成一个功能,这样利于我们后期的扩展。
方法的定义
Java的方法类似于其他语言的函数,是一段用来完成特定功能的代码片段,一般情况下,定义一个方法包含以下语法:
方法包含一个方法头和一个方法体。下面是一个方法的所有部分:
修饰符:修饰符是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。
返回值类型:方法可能会有返回值,returnValueType 是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值,这个时候returnValueType是关键字void。
方法名:是方法的实际名称,方法名和参数表共同构成方法签名。(自命名)
参数类型:参数像是一个占位符,当方法被调用的时候,传递值给参数,这个值被称为实参或者变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法也可以不包含任何参数。
形式参数:在方法被调用时用于接收外界输入的数据。
实参:调用方法时实际传给方法的数据。
方法体:方法体包含具体的语句,定义该方法的功能。
修饰符 返回值类型 方法名(参数类型 参数名){
方法体
return 返回值 ;
}
public class Study01 {
//main 方法
public static void main(String[] args) {
int sum = add(2, 3);//调用下面的add方法 并为其变量赋值
System.out.println(sum);
}
//加法
public static int add(int a , int b){
return a+b;//返回值 a+b
}
}
方法的重载
重载就是在一个类中,有相同的函数名称,但形参不同的函数。
方法重载的规则:
方法名必须相同。
参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)。
方法的返回类型可以相同也可以不同。
仅仅返回类型不同不足以称为方法的重载。
实现理论:
方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错。
public class Study02 {
public static void main(String[] args) {
//比大小
//调用以下方法时,并且会根据参数个数、和类型去自动匹配
int max = max(10, 20, 30);//实参
System.out.println(max);
}
//方法1
public static int max(int a, int b) { //a和b为形参
int result = 0;
if (a == b) {
System.out.println("a=b:");
return a;
}
if (a > b) {
result = a;
} else {
result = b;
}
return result;
}
//方法2
public static double max(double a, double b) {
double result = 0;
if (a == b) {
System.out.println("a=b:");
return a;
}
if (a > b) {
result = a;
} else {
result = b;
}
return result;
}
//方法3
public static double max(int a, int b,int c) {
int result = 0;
if (a == b) {
System.out.println("a=b:");
return a;
}
if (a > b) {
result = a;
} else {
result = b;
}
return result;
}
}
命令行传参
可以通过命令行直接给main方法中传递参数
可变参数
JDK1.5开始,Java支持传递同类型的可变参数给一个方法。
在方法声明中,在指定参数类型后面加一个省略号(...)。
一个方法中只能制定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。
public class Study03 {
public static void main(String[] args) {
method(10,20,30.0,40.0,50.0,25.0);//给参数赋值
}
//声明形参类型 可变参数只能在最后声明 可变参数其本质相当于数组
public static void method(int a,int b,double c,double ...d){ //可变参数的...后面是参数名 相当于数组名
System.out.println(a);
System.out.println(b);
System.out.println(c);
//length 相当于可变参数也就是数组的长度(数组内参数的个数)
for (int i = 0; i <d.length ; i++) {
//输出可变参数中的每个参数
System.out.println(d[i]);
}
}
}
public class Study04 {
public static void main(String[] args) {
//多次赋值并调用方法max
max(1,5,8,11,846,561,223);
max(5,465,512,213,8321,85,122);
max(50,8851,18789,8565,52,754,456);
}
//取可变参数中的最大值
public static void max(int...numbers){
//没有输入参数时直接返回 终止运行
if (numbers.length==0){
return;
}
int result = 0;
//遍历整个可变参数 并不断赋予更大的值
for (int i = 0; i < numbers.length ; i++) {
if (numbers[i] > result){
result = numbers[i];
}
}
System.out.println(result);//由于前面使用了void 所以没有返回值 所以用print手动输出结果
}
}
递归
之前一直使用的是A方法去调用B方法,很容易理解。而递归就是A方法调用A方法!也就是自己调用自己。
利用递归可以用简单的程序解决一些复杂的问题。它通常吧一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归只需要少量程序就可以描述过程所需要的多次重复计算,大大减少了程序的代码量,但是会增加电脑运算的负荷,所以不建议叠加过多层的运算。递归的能力在于用有限的语句来定义对象的无线集合。
递归的结构包括两个部分
递归头:什么时候不调用自身方法。如果没有头,将陷入死循环。
递归体:什么时候需要调用自身方法。
public class Study05 {
public static void main(String[] args) {
System.out.println(f(5));
}
//阶乘 5! 5*4*3*2*1 a的值不能过大 否则过于多次的调用自身的运算容易导致电脑卡死崩溃
public static int f(int a){
//以防输入的数字为负数
if (a<=0){
return 0;
}
//当输入数字为1时直接返回
if(a==1){
return 1;
}else{
return a * f(a - 1);//调用自身这个方法来取值
}
}
}