当前位置: 首页 > news >正文

java基础知识——11.方法

这篇文章,我们来讲一下java中的方法

目录

1.什么是方法

2.方法的格式

2.1 方法的定义格式

2.1.1最简单的定义方法

2.1.2带参数的方法定义

2.1.3带返回值方法的定义

2.1.4方法定义的总结

2.2 方法的调用

2.3 方法的小结

3.方法的重载

4.方法的小练习

4.1数组遍历

 4.2 数组最大值

4.3判断是否存在

4.4复制数组

5.方法的内存

5.1方法调用的基本原理内存

5.2方法传递基本数据类型的内存原理

5.3方法传递引用数据类型的内存原理

6.小结


1.什么是方法

方法:是程序中的最小的执行单元

怎么理解?我们看下面的例子:

在程序运行时,主方法中的输出语句我能只执行一条吗?显然是不可以的,必须全部执行。那么也就是说,当程序运行时,方法是最小的执行单元,不可再分。 

问:什么时候用到方法?

答:重复的代码、具有独立功能的代码可以抽取到方法中

问:实际开发中,方法有什么好处?

答:可以提高代码的复用性,提高代码的可维护性

2.方法的格式

下面我们来学习一下方法的格式。

方法就是把一些代码打包在一起,用的时候进行调用。所以,我们要从方法的打包和方法的调用两方面来学习

方法的定义:把一些代码打包在一起,该过程称为方法的定义

方法的调用:方法定义后并不是直接运行的,需要手动调用才行,该过程称为方法的调用。

2.1 方法的定义格式

下面,我们来看一下方法的定义

2.1.1最简单的定义方法

最简单的定义格式如下:

public static void 方法名() {
    方法体(就是打包起来的代码)
}

范例:

public static void playGame(){
        System.out.println("打游戏");
}

方法的调用

public class Method1 {
    public static void main(String[] args) {
//        直接调用方法名就行
        playGame();
    }
    public static void playGame(){
        System.out.println("打游戏");
    }
}

注意:方法要写在类里面,main方法的外面!!! 

2.1.2带参数的方法定义

问:为什么要有带参数的方法?

答:为了代码的更灵活的使用

带参数的方法定义格式如下:

public static void 方法名(参数类型 参数名,参数类型 参数名……) {
    方法体(就是打包起来的代码)
}

范例:

public static void getSum(int num1,int num2){
        int result = num1 + num2;
        System.out.println(result);
    }

方法的调用

public class Method1 {
    public static void main(String[] args) {

//        写方法名并写入参数
        getSum(10,20);
    }

    public static void getSum(int num1,int num2){
        int result = num1 + num2;
        System.out.println(result);
    }
}

注意:方法调用时,参数的数量和类型必须和方法定义中小括号里面的变量一一对应,否则程序将报错

这里说两个概念:

形参:全称形式参数,是指方法定义中的参数

实参:全称实际参数,是方法调用中的参数

定义方法的技巧

  1. 我要干什么?
  2. 我干这件事需要什么才能完成?

每次定义方法时,我们都可以问自己这些问题

2.1.3带返回值方法的定义

问:为什么要带返回值?

答:有时候我们需要方法的计算结果,所以就需要返回值

带返回值方法的定义格式如下:

public (static) 返回值类型 方法名(参数类型 参数名,参数类型 参数名……) {
    方法体(就是打包起来的代码)
    return 返回值;
}

调用方式:

  1. 直接调用:方法名(实参)
  2. 复制调用:整数类型 变量名 = 方法名(实参)
  3. 输出调用:System.out.println( 方法名(实参) )

范例:

public class Method1 {
    public static void main(String[] args) {

//        赋值调用
        int a = getSum1(10,20);
//        输出调用
        System.out.println(getSum1(10,20));
        
    }

    public static int getSum1(int num1, int num2){
        int result = num1 + num2;
        return result;
    }
}

2.1.4方法定义的总结

上面是方法定义的具体分类,下面总结一下:

方法定义的格式:

public static 返回值类型 方法名(参数类型 参数名,参数类型 参数名……) {
    方法体(就是打包起来的代码)
    return 返回值;
}

这就是标准格式,然后我们可以根据具体的情况来更改返回值类型,参数,返回语句等 

2.2 方法的调用

上面讲方法的定义的时候已经讲了方法的调用,可以回看上面的内容

2.3 方法的小结

下面对方法进行一下小结

方法的定义格式(再次重复):

public static 返回值类型 方法名(参数类型 参数名,参数类型 参数名……) {
    方法体(就是打包起来的代码)
    return 返回值;
}

注意事项:

  1. 方法不调用就不执行
  2. 方法与方法之间是平级关系,不能互相嵌套定义
  3. 方法的编写顺序与其执行顺序无关
  4.  注意方法的返回值与return语句
  5. return语句下面,不能编写代码,因为永远执行不到,属于无效方法

return关键字:

  1. 方法没有返回值:可以省略不写。如果书写,表示结束方法
  2. 方法有返回值:必须要写。表示结束方法和返回结果

3.方法的重载

方法重载的定义:在同一个类中,定义多个同名的方法,这些同名的方法具有同种的功能。每个方法具有不同的参数类型和参数个数,这些同名的方法,就构成重载关系。

简单记忆:同一个类中,方法名相同,参数不同的方法。与返回值无关

参数不同:包括数量不同,类型不同,顺序不同

问:当我们调用一个同名的方法时,JVM是怎么判断我们到底是调用的哪个呢?

答:依靠参数来判定

4.方法的小练习

下面,我们来写几个方法的小练习

4.1数组遍历

需求:定义一个方法用于数组遍历,要求遍历的结果是在一行上的。例如:[11,22,33,44,55]

代码如下:

public class Test1 {
    public static void main(String[] args) {
        int[] arr = new int[]{11,22,33,44,55};
        show(arr);
    }
    public static void show(int[] arr){
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+",");
        }
    }
}

 截图如下:

 4.2 数组最大值

需求:设计一个方法求数组的最大值,并将最大值返回

代码如下:

public class Test1 {

    public static void main(String[] args) {
        int[] arr = {65,45,2,31,56,24,96};
        System.out.println("数组的最大值为:"+TheMax(arr));
    }
    public static int TheMax(int[] arr){
        int max = arr[0];
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] > max)
                max = arr[i];
        }
        return max;
    }
}

结果如下:

 

4.3判断是否存在

需求:定义一个方法判断数组中的某一个数是否存在,将结果返回给调用处

代码如下:

public class Test1 {

    public static void main(String[] args) {
        int[] arr = {65,45,2,31,56,24,96};
        System.out.println("30在数组中存在吗?"+contains(30,arr));
    }

    public static boolean contains(int number ,int[] arr ){
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == number )
                return true;
        }
        return false;
    }
}

截图如下:

4.4复制数组

需求:定义一个方法,将数组arr中从索引from(包含form)开始,到索引to(不包含to)的元素复制到新数组中,将新数组返回。

代码如下:

public class Test1 {

    public static void main(String[] args) {
        int[] arr = {65,45,2,31,56,24,96};
        int[] arr1 = copyOfRange(2,6,arr);
        for (int i = 0; i < arr1.length; i++) {
            System.out.println(arr1[i]);
        }
    }
    public static int[] copyOfRange(int from,int to,int[] arr){
        int[] arr1 = new int[to - from];
        int index = 0;
        for (int i = from; i <to ; i++) {
            arr1[index] = arr[i];
            index++;
        }
        return arr1;
    }
}

截图如下:

 

5.方法的内存

下面,我们来讲一讲方法的内存

5.1方法调用的基本原理内存

在讲数组的内存时,我们讲过java的内存,下面回顾一下:

栈:方法运行时使用的内存,方法进栈运行,运行完毕出栈

堆:new出来的,都在堆内存中开辟了一个小空间

下面,我们根据具体的代码来讲解一下:

 内存图如下:

分析:

当程序运行时,方法入栈,即main方法入栈,方法入栈之后,然后依次执行方法内部的内容,即创建和打印数组arr

下面,我们来看一下复杂的:

内存图如下:

 

分析:

程序开始运行,首先main方法入栈,然后执行eat方法eat方法入栈,入栈之后执行study方法,所以study方法入栈,study放打印输出完成之后,study方法出栈,然后eat方法执行打印输出语句,执行完成之后,执行sleep方法,所以sleep方法入栈,sleep方法打印输出完成之后,sleep方法出栈,此时eat方法执行完毕,eat方法出栈,此时main方法执行完毕,main方法出栈,程序执行结束。

5.2方法传递基本数据类型的内存原理

基本数据类型:就是变量中存的是真实的数据

内存图如下图所示:

引用数据类型:变量中存储的是地址值

内存图如下图所示:

5.3方法传递引用数据类型的内存原理

下面,我们来看一个代码:

看下运行结果:

 

这个其实很简单,就直接说结论了

结论:传递基本数据类型时,传递的是真实的数据,不是地址,形参的改变,不会影响实际参数的值 

下面,看一下另一个代码:

看下结果:

 

结论:传递引用数据类型时,传递的是地址,不是地址中的值,形参的改变,会影响实际参数的值 

6.小结

这篇文章,我们学习了java的方法。怎么说呢,这部分内容不算难,是基础,多练习就好。

相关文章:

  • 什么是web3?未来趋势?怎么学?
  • 2023第二届浙江省技能大赛温州市选拔赛任务书
  • 技术分享及探讨
  • NDK(四):Native与Java互调
  • SpringSecurity
  • 机器学习:基于逻辑回归对优惠券使用情况预测分析
  • 米哈游春招后端-2023.03.19-第一题-米哈游的RBG矩阵-简单
  • 教你精通JavaSE语法之第九章、抽象类和接口
  • 龙芯2K1000开发板拷贝镜像到固态
  • 前端计算文件 hash
  • ChatGPT写作文章-快速使用ChatGPT不用注册方式
  • 2万字60道MySQL经典面试题总结(附答案)
  • Maven生命周期、mvn命令、Maven插件
  • 【ChatGPT】这是一篇ChatGPT写的关于Python的文章
  • Ubuntu之NVIDIA GeForce显卡驱动安装
  • 2017-08-04 前端日报
  • Android 架构优化~MVP 架构改造
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • CentOS7 安装JDK
  • input的行数自动增减
  • JAVA_NIO系列——Channel和Buffer详解
  • Linux中的硬链接与软链接
  • maven工程打包jar以及java jar命令的classpath使用
  • mongo索引构建
  • PaddlePaddle-GitHub的正确打开姿势
  • Spring框架之我见(三)——IOC、AOP
  • unity如何实现一个固定宽度的orthagraphic相机
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 记一次删除Git记录中的大文件的过程
  • 驱动程序原理
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • Java性能优化之JVM GC(垃圾回收机制)
  • linux 淘宝开源监控工具tsar
  • ​io --- 处理流的核心工具​
  • # 安徽锐锋科技IDMS系统简介
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #1015 : KMP算法
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (分布式缓存)Redis哨兵
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)scrum常见工具列表
  • (转)程序员技术练级攻略
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .NET 8.0 中有哪些新的变化?
  • .NET Standard 的管理策略
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .net6使用Sejil可视化日志
  • .NET程序员迈向卓越的必由之路
  • .NET精简框架的“无法找到资源程序集”异常释疑