方法
一、方法的定义
修饰符 返回值类型 方法名(参数类型 参数名){
...
方法体
...
return 返回值;
}
方法包含一个方法头和一个方法体。下面是一个方法的所有部分:
- 修饰符:修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。
- 返回值类型 :方法可能会返回值。returnValueType 是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,returnValueType 是关键字 void。
- 方法名:是方法的实际名称。方法名和参数表共同构成方法签名。
- 参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
- 方法体:方法体包含具体的语句,定义该方法的功能。
public class Demo01{
public static void main(String []args){//void是返回值类型 无返回值
int sum=add(a:1,b:2);//实参
System.out.println(sum);
//test();
}
public static int add(int a,int b){//形参
return a+b;
}
public static void test(){
...
}
}
二、方法的调用
Java 支持两种调用方法的方式,根据方法是否返回值来选择。
当程序调用一个方法时,程序的控制权交给了被调用的方法。当被调用方法的返回语句执行或者到达方法体闭括号时候交还控制权给程序。
当方法返回一个值的时候,方法调用通常被当做一个值。例如:
int larger = max(30, 40);
如果方法返回值是void,方法调用一定是一条语句。例如,方法println返回void。下面的调用是个语句:
System.out.println("你好 请努力学习!");
一个void类型方法,它不返回值。
一个void方法的调用一定是一个语句
public class Demo01 {
public static void main(String[] args) {
System.out.println(compare(10, 20));
}
//比大小 找大的
public static int compare(int num1, int num2) {
int result = 0;
if (num1 == num2) {
System.out.println("num1==num2");
return 0;//终止方法
}
if (num1 > num2) {
result = num1;
} else {
result = num2;
}
return result;
}
}
三、Java通过值传递参数
调用一个方法时候需要提供参数,必须按照参数列表指定的顺序提供。
四、方法的重载
先来看下方法重载(Overloading)的定义:
如果有两个方法的方法名相同,但参数不一致,哪么可以说一个方法是另一个方法的重载。 具体说明如下:
- 方法名相同
- 方法的参数类型,参数个不一样
- 方法的返回类型可以不相同
- 方法的修饰符可以不相同
- main 方法也可以被重载
public class Demo01 {
public static void main(String[] args) {
//方法名相同,但是返回值类型和参数不同
int i = compare(10, 20);
System.out.println(i);
double d = compare(10.0, 20.0);
System.out.println(d);
}
private static double compare(double v, double v1) {
double result = 0;
if (v == v1) {
System.out.println("v==v1");
return 0;//终止方法
}
if (v > v1) {
result = v;
} else {
result = v1;
}
return result;
}
//比大小 找大的
public static int compare(int num1, int num2) {
int result = 0;
if (num1 == num2) {
System.out.println("num1==num2");
return 0;//终止方法
}
if (num1 > num2) {
result = num1;
} else {
result = num2;
}
return result;
}
}
五、命令行传参
在idea中,在main方法中定义数组相关方法,在命令行中输出数组 数据
public class Demo02 {
public static void main(String[] args) {
//args.length()数组长度
for(int i=0;i<args.length;i++){
System.out.println("agrs["+i+"]:"+args[i]);
}
}
}
六、可变参数
在 Java 5 中提供了变长参数,允许在调用方法时传入不定长度的参数。
变长参数是 Java 的一个语法,本质上还是基于数组的实现:
void foo(String... args);//int... i、double... d。。。。。
void foo(String[] args);
//方法签名
([Ljava/lang/String;)V // public void foo(String[] args)
public class Demo03 {
public static void main(String[] args) {
Demo03 demo03 = new Demo03();
demo03.test(1,2,3,4,5,6);//下标从0开始 test数字可以发生变化 无限延长
}
public void test(int x,int... i) {
//int... i可变参数必须要在最后面 且传递参数类型一致都是整形
System.out.println(i[1]);
System.out.println(i[2]);
System.out.println(i[3]);
System.out.println(i[4]);
System.out.println(i[5]);//输出也可以无限延长
}
//这种会比较麻烦 所以要引入可变参数
public void method() {}
public void method(int i) {}
public void method(double d) {}
public void method(float f) {}
}
定义方法
在定义方法时,在最后一个形参后加上三点 …,就表示该形参可以接受多个参数值,多个参数值被当成数组传入。上述定义有几个要点需要注意:
-
可变参数只能作为函数的最后一个参数,但其前面可以有也可以没有任何其他参数
-
由于可变参数必须是最后一个参数,所以一个函数最多只能有一个可变参数
-
Java的可变参数,会被编译器转型为一个数组
-
变长参数在编译为字节码后,在方法签名中就是以数组形态出现的。这两个方法的签名是一致的,不能作为方法的重载。如果同时出现,是不能编译通过的。可变参数可以兼容数组,反之则不成立
public void foo(String...varargs){} foo("arg1", "arg2", "arg3"); //上述过程和下面的调用是等价的 foo(new String[]{"arg1", "arg2", "arg3"});
七、递归
- A方法调用B方法,我们很容易理解!
- 递归就是:A方法调用A方法!就是自己调用自己
- 利用递归可以用简单的程序来解决一些复杂的问题。
- 它通常把一个大型复杂的问题层层转化为一个,与原问题相似的规模较小的问题来求解,
- 递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
- 递归的能力在于用有限的语句来定义对象的无限集合;
递归结构包括两个部分:
- 递归头:什么时候不调用自身方法。如果没有头,将陷入死循环(一个边界值)
- 递归体:什么时候需要调用自身方法
public class Demo04 {
public static void main(String[] args) {
//递归思想
System.out.println(f(5));//5! 5的阶乘:120
}
public static int f(int n){
if(n==1){//f1是边界值,是递归头 栈的思想
return 1;
}else{
return n*f(n-1);
}
}
}