Java方法详解
1、方法的定义
Java方法是语句的集合,它们在一起执行一个功能
方法是解决一类问题的步骤的有序组合,包含于类或对象中;在程序中被创建,在其它地方被引用
设计方法的原则:要遵守原子性,即一个方法只完成一个功能
方法包含一个方法头和一个方法体
◇ 修饰符:可选,定义了该方法的访问类型
◇返回值类型:方法返回值的数据类型,没有返回值用void
◇方法名:方法的实际名称
◇参数类型:传递值给参数
参数列表:指方法的参数类型、顺序和参数个数
形式参数:在方法被调用时用于接收外界输入的数据
实参:调用方法时实际传给方法的数据
◇方法体:定义该方法的功能
修饰符 返回值类型 方法名(参数类型 参数名){ 方法体 return 返回值; }
2、方法的调用
①对象名.方法名(实参列表) 需要实例化一个对象,然后调用方法
②直接调用相应方法(用static修饰,是类方法)
注意点:在static方法中不能调用普通方法,因为静态方法是和类绑定并一起出现的,而普通方法需要类实例化后才可以调用
3、方法的重载
①重载就是在一个类中,有相同的函数名称,但形参不同的函数
②方法重载的规则:
1.方法名称必须相同
2.参数列表必须不同(个数不同、或类型不同、参数排列顺序不同等)
3.方法的返回值类型可以相同也可以不同
4.仅仅返回类型不同不足以成为方法的重载
1 public class Overload {
2 public static void main(String[] args) {
3 int a=1;
4 int b=2;
5 int c=3;
6 double a1=1.5;
7 double b1=3.5;
8 System.out.println(add(a,b,c)); //调用方法1
9 System.out.println(add(a,b)); //调用方法2
10 System.out.println(add(a1,b1)); //调用方法3
11 }
12 public static int add(int a,int b,int c){ //方法1
13 return a+b+c;
14 }
15 public static int add(int a,int b){ //方法2
16 return a+b;
17 }
18 public static double add(double a,double b){ ////方法3
19 return a+b;
20 }
21 }
4、命令行传参
有时候希望运行一个程序时候再传递给它消息,这要靠传递命令行参数给main()函数实现
①编写java文件
1 public class Demo1 {
2 public static void main(String[] args) {
3 //args.length 是数组长度
4 for(int i=0;i<args.length;i++){
5 System.out.println("args["+i+"]="+args[i]);
6 }
7 }
8 }
②通过命令行窗口将java文件编译成class文件
5、可变参数
在方法声明中,在指定参数类型后加一个省略号(...)
一个方法中只能指定一个可变参数,它必须是方法的最后一个参数,任何普通的参数必须在它之前声明
int... i 指的是要传递int型参数,但不确定参数个数
1 public class Demo2 {
2 public static void main(String[] args) {
3 int a=1;
4 int b=2;
5 int c=3;
6 System.out.println(Max(a)); //结果为1
7 System.out.println(Max(a,b)); //结果为2
8 System.out.println(Max(a,b,c)); //结果为3
9 }
10 public static int Max(int i,int ...numbers){
11 int result=i;
12 for(int j=0;j<numbers.length;j++){
13 if(result<numbers[j]){
14 result=numbers[j];
15 }
16 }
17 return result;
18 }
19 }
6、递归
递归就是方法自己调用自己
递归可以把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,能大大减少程序的代码量
①递归结构包含两个部分
递归头:什么时候不调用自身方法。如果没有头,将陷入死循环
递归体:什么时候需要调用自身方法
例如:阶乘
1 public class Factorial {
2 public static void main(String[] args) {
3 System.out.println(f(5));
4 }
5
6 public static int f(int n){
7 if(n==1){
8 return 1;
9 }else{
10 return n*f(n-1);
11 }
12 }
13 }
递归通过栈实现,通过5!进行解释说明
每调用一个函数,系统就将其数据保存进一个栈中,通过代码分析可知该方法会依次调用f(5)、f(4)、f(3)、f(2)、f(1),分别将这些函数的数据依次入栈,如下图所示
栈是先进后出顺序执行,因此先出栈f(1),调用f(1)代码,返回值为1;再执行f(2),返回值为2*1=2;依次类推,如下所示: