Java(5)——方法

举报
ArimaMisaki 发表于 2022/08/09 01:07:40 2022/08/09
【摘要】 第五章 方法 文章目录 第五章 方法5.1 方法的定义、调用5.1.1 方法完整的定义形式、调用5.1.2 方法的其他定义形式、调用 5.2 方法使用的常见问题5.3 方法案例5.4 ...

第五章 方法



方法概述

方法是一个语法结构,他可以把一段代码封装成一个功能,以方便反复调用,类似于C++中的函数


方法好处

  • 提高代码的复用性
  • 让程序的逻辑更清晰

示例

public class MethodDemo1 {
    public static void main(String[] args) {
        //张工
        int c1 = sum(10,30);
        System.out.println(c1);

        //徐工
        int c2 = sum(10,50);
        System.out.println(c2);
    }

    public static int sum(int a,int b)
    {
        int c = a+b;
        return c;
    }
}

out:

image-20220528155059932


5.1 方法的定义、调用

5.1.1 方法完整的定义形式、调用


方法定义格式

修饰符 返回值类型 方法名(形参列表){
	方法体代码(需要执行的功能代码)
	return 返回值;
}

方法定义示例

public static int add(int a,int b){
	int c = a+b;
	return c;
}

方法调用格式

方法名();

示例

public class MethodDemo2 {
    public static void main(String[] args) {
        int rs = add(100,200);
        System.out.println("和是:"+rs);
    }
    
    public static int add(int a,int b){
        int c = a+b;
        return c;
    }
}

方法格式的注意点

  • 方法的修饰符:暂时都使用public static修饰

  • 方法申明了具体的返回值类型,内部必须使用return返回对应类型的数据。

  • 形参列表可以有多个,甚至可以没有;如果有多个形参必须用","隔开,且不能给初始化值。


5.1.2 方法的其他定义形式、调用


如果方法不需要返回结果,返回值类型必须申明为void(无返回值),此时方法内部不可以使用return返回数据(如果非要写return,后面不跟东西即可)。

方法如果没有参数,或者返回值类型申明为void可以称为无参数、无返回值的方法,以此类推。


5.2 方法使用的常见问题


方法的编写顺序无所谓

​ 与C++的函数不同,Java方法可以写在主方法的后面。而在C++中,函数如果写在后面,最前面一定要写函数声明(函数原型)。


方法和方法之间是平级关系,不能嵌套定义

​ C++中同样不允许函数嵌套定义,但是允许函数嵌套调用,java中的方法也是如此。


方法的返回值类型为void,方法内不能使用return返回数据;如果方法的返回值类型写了具体类型,方法内部则必须使用return返回对应类型的数据


方法不调用就不执行,调用时必须严格执行匹配方法的参数情况


有返回值的方法调用时可以选择定义变量接收结果,或者直接输出调用,甚至直接调用;无返回值方法的调用只能直接调用


5.3 方法案例


案例一:定义一个方法,方法中计算出1到n的和并返回。

public class Test {
    public static void main(String[] args) {
        System.out.println("1-5的和是:"+sum(5));
    }

    public static int sum(int n){
        int sum = 0;
        for(int i =1;i<=n;i++)
        {
            sum+=1;
        }
        return sum;
    }
}

out:

image-20220528160534926


案例二:判断整数为奇数还是偶数

public class Test {
    public static void main(String[] args) {
        check(11);
        System.out.println("----------");
        check(100);
    }

    public static void check(int number){
        if(number % 2 == 0)
        {
            System.out.println(number + "是偶数");
        }
        else{
            System.out.println(number + "是奇数");
        }
    }
}

out:

image-20220528161004658


5.4 方法调用内存图


方法在没有被调用的时候,在方法区的字节码文件中存放

方法被调用的时候,需要进入到栈内存中运行


形象图

image-20211106161545326

如果把方法比作子弹,则弹夹是方法区,手枪则是栈区。


示意图

image-20211106161743744


5.5 方法的参数传递机制(面试题常考)

5.5.1 基本类型的参数传递


java的参数传递机制是值传递,不像C++,既可以值传递也可以地址传递;值传递的本质就是:在传输实参给方法的形参的时候,并不是传输实参变量(地址)本身,而是传输实参变量(该内存地址)中存储的值。

  • 实参:在方法内部定义的变量
  • 形参:在定义方法时,()中所声明的参数。

面试题中经常会有如下题目

public class MethodDemo1 {
    public static void main(String[] args) {
        //目标:理解Java的基本类型的参数传递:值传递
        int a = 10;
        change(a);
        //输入,a虽然在方法里被改变,但是方法外没变
        System.out.println(a);
    }

    public static void change(int a){
        //传入方法前
        System.out.println(a);
        //改变传入方法的参数
        a = 20;
        //改变后的参数
        System.out.println(a);
    }
}

面试题原理示意图

image-20211106163755258


5.5.2 引用类型的传递机制


虽然看起来也是值传递,实际上已经是地址传递了;其用法实际上和C++别无二致。

面试题经常有如下题目

public class MethodDemo2 {
    public static void main(String[] args) {
        //目标:理解引用类型的参数传递机制:值传递,区分其不同点


        int[] arr = {10, 20, 30};
        System.out.println(arr[1]);
        change(arr);
        System.out.println(arr[1]);
    }

    public static void change(int[] arr){
        System.out.println(arr[1]);
        arr[1] = 222;
        System.out.println(arr[1]);
    }
}

示意图

image-20211106164608947


5.6 方法的参数传递案例

案例一:打印整型数组内容

设计一个方法用于输出任意整型数组的内容,要求输出成如下格式:“该数组内容为:[]”


public class Test {
    public static void main(String[] args) {
        int[] ages = {10,20,30,40};
        printArray(ages);
    }

    public static void printArray(int[] arr){
        System.out.print("{");
        for (int i =0;i<arr.length;i++)
        {
//            if(i == arr.length-1)
//                System.out.print(arr[i]);
//            else
//                System.out.print(arr[i]+",");
            System.out.print(i == arr.length-1?arr[i]:arr[i]+",");
        }
        System.out.println("}");
    }
}

out:

image-20220528162542143


案例二:从数组中查询指定元素的索引

设计一个方法可以接收整型数组和要查询的元素值;最终要返回元素在该数组中的索引,如果数组中不存在该元素则返回-1。


public class Test {
    public static void main(String[] args) {
        int[] ages = {10,20,30,40};
        System.out.println(select(ages,20));
    }

    public static int select(int[] arr,int n){
        for(int i = 0;i<arr.length;i++)
        {
            if(arr[i] == n)
                return i;
        }
        return -1;
    }
}

out:

image-20220528163228279

5.7 方法重载

5.7.1 方法重载的形式、作用


引入

方法重载名词挺好听,但是其实没那么难。实际上,方法重载也是一种多态。

打个比方,一个人叫你打车,但是你可能打的是出租车,也有可能是公交车,这取决于你打车这个方法里不同的行为。这就是方法重载,也就是所谓行为的多态性。


导学

假如要我们开发武器系统,功能需求如下:

  • 可以默认发射一枚武器
  • 可以指定地区发射一枚武器
  • 可以指定地区发射多枚武器

示意图

image-20211106165722473

当然调用的时候名字都一样怎么办?调用方法的时候,会通过参数的不同来区分调用的是哪个方法;因为我们在前面说过,如果要调用一个方法,里面的参数时不能少不能多的,所以一个方法1个参数就需要传1个,两个就传两个。


概念

方法重载的意思是:一个类可以有多个方法具有相同的名字(比如打车),但是这些方法的参数不能一样(比如你的打车是打出租车,我是打公交车),参数不同可以满足下列要求:

  • 参数个数不同(比如计算方法,可以传一个参数,也可以传两个)
  • 参数个数相同,但参数列表中对应的某个参数的类型不同

方法重载指同一个类中定义的多个方法之间的关系,满足下列条件的多个方法相互构成重载。

  • 多个方法在同一个类中。
  • 多个方法有相同的方法名。
  • 多个方法的参数不相同,类型不同或者数量不同。

方法重载的特点

重载仅对应方法的定义,与方法的调用无关,调用方法参照标准格式

重载仅针对同一个类中方法的名称和参数进行识别,与返回值无关,换句话说不能通过返回值来判定两个方法是否相互构成重载。


方法重载的作用

对于相似功能的业务场景,可读性好,方法名称相同提示是同一类型的功能,通过形参不同实现功能差异化的选择,这是一种专业的代码设计。


注意问题

重载的时候虽然保证了相互的参数不相同,但是仍然有可能重载方法被调用的时候会出现歧义调用。


总结

方法重载实际上和C++的函数重载别无二致,并且Java中也提供了占位符思想。举一个简单的例子,同样是开车,拖拉机需要拖拉机钥匙,校车需要校车钥匙,那么传入的参数就有所不同;但是他们本质都是开车,所以方法名当然可以一样,但是对于不同的车,参数肯定不同,当然有很多种不同的方式:比如说我钥匙可以不一样(即数据类型不一样),当然我也可以是启动的钥匙数目不一样(即参数的个数不同)。


5.7.2 方法重载的识别技巧(面试题常考)


  • 只要是在同一个类中,方法名称相同、形参列表不同,那么他们就是重载的方法,其他都不管。(即使修饰符,返回值类型也无所谓)
  • 形参列表不同指的是:形参的个数、类型、顺序不同,不关心形参的名称

示例

public class MethodDemo2 {
    //新方法
    public static void open(){}

    //重载方法
    public static void open(int a){}

    //重载方法
    static void open(int a,int b){}

    //重载方法
    public static void open(double a,int b){}

    //重载方法
    public static void open(int a,double b){}

    //和上一条的方法重复了,因为方法重载不关心形参的名称,所以不是重载方法
    public void open(int i,double d){}
    
    //名称不一样,不是重载方法,是一种新方法
    public static OPEN(){}
}

5.8 单独使用return关键字

return;可以立即跳出并结束当前方法的执行;return关键字单独使用可以放在任何方法中。


使用场景代码

public class returnDemo {
    public static void main(String[] args) {
        //目标:明确return关键字的作用
        //如果插入的分母为0,程序要提示报错
        chu(10,0);
    }

    public static void chu(int a,int b){
        if(b == 0){
            System.out.println("您输入的数据有问题,除数不能是0!");
            return;//立即退出当前方法。
        }
        
        int c = a/b;
        System.out.println("除法的结果是:"+c);
    }
}

out:

image-20220528163316372

文章来源: blog.csdn.net,作者:ArimaMisaki,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/chengyuhaomei520/article/details/125044842

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。