方法的详解

方法

1.何谓方法

例如前面用到的System.out.println()

println()是一个方法

System是系统类

out是标准输出对象

调用系统类System中的标准输出对象out中的方法println()

在java里,方法不能独立存在,必须属于类或对象

2.方法定义

修饰符:

告诉编译器如何调用该方法,定义了访问类型

返回值类型(returnValueType):

方法返回值的数据类型,有些方法没有返回值,returnValueType是关键字void

方法名:

实际方法名称

参数类型:

参数像是一个占位符,方法被调用时,传递值给参数,这个值为实参。方法可以不包含任何参数

  • 形参:调用时用于接收外界输入数据
  • 实参:调用时实际传给方法的数据

3.方法调用

当方法返回一个值的时候,方法调用通常被当作一个值,例如:

int larger = max(3,4);

当方法返回值是void,方法调用一定是一条语句。例如上面提到的方法println()返回void,调用的话:

System.out.println(“Hello,World”);

4.方法的参数传递机制

如果声明方法时包含了形参,则调用时必须为形参传入实参。

Java里参数传递方式只有一种:值传递–即将实参的副本(复制品)传入方法内,参数本身不受影响

  • 基本数据类型参数传递:

    package com.method;
    
    public class Demo {
        public static void swap(int a,int b){
            int temp = a;
            a = b;
            b = temp;
            System.out.println("swap该方法里a的值是:"+a+",b的值是:"+b);
        }
        public static void main(String[] args) {
            int a = 3;
            int b = 4;
            swap(3,4);
            System.out.println("交换结束后a的值是:"+a+",b的值是:"+b);
        }
    }
    
    

    输出:

    swap该方法里a的值是:4,b的值是:3
    交换结束后a的值是:3,b的值是:4

    当程序执行swap方法时,将main方法中的实参传入swap方法,此时传入的只是a,b的副本,不是a,b本身,当swap栈区对a,b进行交换后,main栈区的a与b本身未发生改变,这就是值传递的本质

  • 引用数据类型参数传递

    package com.method;
    
    public class Demo1 {
        public static void swap(DateWrap dateWrap){
            int temp = dateWrap.a;
            dateWrap.a = dateWrap.b;
            dateWrap.b = temp;
            System.out.println("swap方法里a成员变量的值是:"+dateWrap.a+"b的值是:"+dateWrap.b);
    
        }
    
        public static void main(String[] args) {
            DateWrap dateWrap = new DateWrap();
            dateWrap.a = 6;
            dateWrap.b = 9;
            swap(dateWrap);
            System.out.println("main();方法里a成员变量的值是:"+dateWrap.a+"b的值是:"+dateWrap.b);
        }
    }
    

    输出:

    swap方法里a成员变量的值是:9b的值是:6
    main();方法里a成员变量的值是:9b的值是:6

    此时形参受影响的原因是值传递过程中传递的是变量的引用,而改变的确实对象中成员变量本身,因此交换后main方法中实参依旧指向对象本身,只是对象本身被改变了

5.方法重载

package com.liu.method;

public class OverLoad {
        public void test(){
            System.out.println("无参数");
        }
        public void test(String msg){
            System.out.println("重载的test方法"+msg);
        }

    public static void main(String[] args) {
        OverLoad ol = new OverLoad();
        //调用test()时没传入参数,因此系统调用无参方法
        ol.test();
        ol.test("hello");

    }
}

一个类中两个方法有同样的名字,但有不同的参数列表(个数,类型,参数排列顺序),称作方法重载

6.可变参数

在方法声明中,在指定参数类型后加一个省略号(…)。

一个方法只能指定一个可变参数,它必须是方法的最后一个参数。

package com.method;

public class Varargs {
    //定义了形参个数可变的方法
    public static void test(int a,String...books){
    //public static void test(int a,String[] books)两者效果完全一样      
        //books被当作数组处理
        for (String book : books) {
            System.out.println(book);
        }
        System.out.println(a);
    }

    public static void main(String[] args) {
        test(5,"百年孤独","白鹿原");
        //test(5,new String[]{"百年孤独","白鹿原"});使用后者传参调用时必须传入数组
    }
}

7.递归

递归就是:A方法调用A方法,因此在设计递归时,一定要指明什么时候自己不用调用自己,否则即为死循环!

递归结构包括两个部分:

  1. 递归头:什么时候不用调用自身方法,如果没用头,将陷入死循环
  2. 递归体:什么时候需要调用自身方法

【演示:5的阶乘】

package com.liu.method;

public class Recursive {
    public static void main(String[] args) {
        System.out.println(f(5));
    }
    public static int fn(int n){
        if(n==1)
            return 1;
        else
            return n*f(n-1);
    }
}

能不递归就不递归,递归都可以用迭代来代替

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值