【JAVA入门】Day04 - 方法

news2024/11/28 8:35:17

【JAVA入门】Day04 - 方法


文章目录

  • 【JAVA入门】Day04 - 方法
    • 一、方法的格式
      • 1.1 无参无返回值的方法定义和调用
      • 1.2 带参数的方法定义和调用
      • 1.3 形参和实参
      • 1.4 带返回值的方法定义和调用
      • 1.5 方法的注意事项
    • 二、方法的重载
    • 三、方法的使用
    • 四、方法的内存原理
      • 4.1 方法调用的基本内存原理
      • 4.2 方法传递基本数据类型的内存原理


        方法(methond)是程序中最小的执行单元。在编写程序时,我们将重复的代码、具有独立功能的代码抽取到方法中,从而节省大量的代码量,提高代码的复用性、可维护性。

一、方法的格式

        把一些代码打包在一起,这个过程叫做方法定义
        方法定义后不是直接运行的,需要手动调用才能执行,这个过程称为方法调用

1.1 无参无返回值的方法定义和调用

定义格式:

public static void 方法名(){
	方法体(打包代码);
}

调用格式:

方法名();

1.2 带参数的方法定义和调用

定义格式:

public static void 方法名(参数1, 参数2, ...){
	方法体(打包代码);
}

调用格式:

方法名(参数1, 参数2, ...);

注意:在传递参数时,参数的数据类型也要和定义时的数据类型一一对应。

1.3 形参和实参

        形参就是形式参数,即方法定义中的参数。
        实参就是实际参数,即方法调用中的参数。

    public static void main(String[] args) {
        getSum(10, 20);
    }

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

        以上方的代码为例,10 20 是实参,num1 num2 是形参,它们的数据类型需要一一对应。

【例1】求出⚪的面积。
需求:定义一个方法,求圆的面积,将结果打印于方法。

public static void main(String[] args) {
        getArea(1.5);
    }
    
    public static void getArea(double r) {
        double pi = 3.1415926;
        double area = pi*r*r;
        System.out.println(area);
    }

1.4 带返回值的方法定义和调用

        带返回值的方法在执行完毕后,可以将最终运行结果返回。为了在调用处拿到方法产生的结果,就需要定义带有返回值的方法。
定义格式:

public static 返回值类型 方法名(参数1, 参数2, ...){
	方法体(打包代码);
	return 返回值;
}

注意:有返回值的函数需要指定返回值类型(类型不为 void),并且函数体内一定要有 return 语句,用于返回值的返回。
例:

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

调用格式:

  • 直接调用:
方法名(实参);

直接调用的方法是不接收返回值,而是单纯执行这个方法。

  • 赋值调用:
变量类型 变量名 = 方法名(实参);

赋值调用是用一个变量接收返回值并存储下来留作备用。

  • 输出调用:
System.out.println(方法名(实参));

输出调用是将方法的运行结果直接放到打印语句中,这样可以直接打印在控制台。
【例2】定义方法,比较两个长方形的面积。

    public static void main(String[] args) {
        double rec1,rec2;
        rec1 = getArea(1,2);
        rec2 = getArea(3,4);
        if(rec1 > rec2) {
            System.out.println("rec1面积大");
        }
        else if(rec1 == rec2) {
            System.out.println("两个面积一样大");
        }
        else {
            System.out.println("rec2面积大");
        }

    }

    public static int getArea(double w, double h) {
        double area = w*h;
        return area;
    }

        以上就是一个方法体完整的定义和调用格式。

1.5 方法的注意事项

  • 方法不调用就不会执行
  • 方法与方法之间是平级关系,不能互相嵌套定义,但可以嵌套调用。
  • 方法的编写顺序与运行顺序无关。
  • 如果一个方法的返回值类型写的是 void,则表示该方法没有返回值,其 return 语句可以省略不写,如果要写,直接写作:
return;
  • return 语句下面编写的代码,永远执行不到,属于无效代码。

二、方法的重载

        在同一个类中,定义了多个同名的方法,这些同名的方法具有同种的功能。
        每个方法具有不同的参数类型参数个数,这些同名的方法,构成了一种重载的关系。
        因此,在同一个类中,方法名相同,参数不同的方法(与返回值无关),叫做重载方法。其中,参数不同可能包括:个数不同、类型不同、顺序不同。
【例1】求和。

public class MethodDemo {
	
	public static int sum(int a, int b) {
		return a + b;
	}

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

以上两个方法在同一个类里,且方法名相同,参数不同,所以构成重载。
【例2】返回值无关。

public class MethodDemo {
	public static void fn(int a) {
		//方法体
	}
	public static int fn(int a) {
		//方法体
	}

以上两个方法纵使返回值不同,但是它们名字相同,参数也相同,所以不构成重载。

public class MethodDemo {
	public static float fn(int a) {
		//方法体
	}
	public static int fn(int a, int b) {
		//方法体
	}

以上两个方法返回值不同,那无所谓,只因为它们名字相同,参数也相同,所以构成重载。

【例3】不在同一个类里的两个同名函数,也不构成重载。

public class MethodDemo1 {
	public static float fn(int a) {
			//方法体
	}
}
public class MethodDemo2 {
	public static float fn(int a) {
			//方法体
	}
}

以上看似两个完全一样的方法,因为在不同的类中,所以也不构成重载。

【例4】参数顺序。

public class MethodDemo {
	public static void fn(int a, double b) {
		//方法体
	}
	public static void fn(double a, int b) {
		//方法体
	}

形参个数一样,方法名字一样,但是类型排列的顺序不同,这个时候也构成重载。

三、方法的使用

【练习1】数组遍历。
需求:设计一个方法用于数组遍历,要求遍历结果打印在一行。

public class Test {
	public static void main(String[] args) {
		//1.定义数组
		int[] arr = {11, 22, 33, 44, 55};

		//2.调用遍历方法
		printArr(arr);
	}
	//定义方法用于数组的遍历
	public static void printArr(int[] arr) {
		System.out.print("[");
		for(int i = 0; i < arr.length - 1; i++) {
			System.out.print(arr[i] + ", ");
		}
		System.out.println(arr[arr.length - 1] + "]");
	}
}

【练习2】求数组最大值。
需求:设计一个方法,求数组的最大值,并将最大值返回。

public class Test {
	public static void main(String[] args) {
		//1.定义数组
		int[] arr = {11, 22, 33, 44, 55};
		
		//2.调用方法求最大值
		int max = getMax(arr);
		
		//3.打印
		System.out.println(max);
	}
	//定义方法用于数组求最大值
	public static int getMax(int[] arr) {
		int max = arr[0];
		for(int i = 1; i < arr.length; i++) {
			if(arr[i] > max) {
				max = arr[i];
			}
		}
		return max;
	}	
}

【练习3】定义一个方法,判断数组中的某一个数是否存在,将结果返回给调用处。

import java.util.Scanner;

public class Test {
	public static void main(String[] args) {
		int[] arr = {1, 5, 8, 12, 56, 89, 34, 67};
		//生成一个输入对象
		Scanner sc = new Scanner(System.in);

		//输入num
		int num = sc.nextInt();
		boolean flag = contains(arr, num);
		System.out.println(result);
	}

	//定义一个方法,判断数组中某一个数是否存在
	public static boolean contains(int[] arr, int num) {
		for(int i = 0; i < arr.length; i++) {
			if(arr[i] == num) {
				return true;
			}
		}
		return false;   //循环完毕后仍找不到,所以返回false
	}
}

【练习4】定义一个方法copyOfRange(int[] arr, int from, int to),将数组 arr 中从索引 from(包含 from)开始,到索引 to 结束(不包含 to)的元素复制到新数组中,将新数组返回。

public class Test {
	public static void main(String[] args) {
		int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
		int[] newArr = copyOfRange(arr);
		System.out.println(newArr);
	}
	public static int[] copyOfRange(int[] arr, int from, int to) {
		//定义新数组,不知道存几个,所以定义动态数组
		int[] newArr = new int[to - from];
	    //用循环把数组元素挨个存储到新数组中
		for(int i = from, j = 0; i < to; i++, j++) {
			newArr[j] = arr[i];
		}
		//把新数组返回
		return newArr;
	}
}

四、方法的内存原理

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

【例1】单个方法

public class MethodDemo {
	public static void main(String[] args) {
		int number = 100;
		sout("number的值为:" + number);
	}
}

        上述代码中,MethodDemo 中仅有一个 main 方法,且没用到 new 关键字,因此不涉及堆内存,仅仅使用到了栈。
        在调用 main 方法时,方法会进入栈底,然后执行方法中的语句。方法中定义的变量和其值是实实在在存储于栈里的。
在这里插入图片描述
        执行完毕后,main 方法会出栈,而里面存储的 int number 变量也会随之消失。
【例2】嵌套方法调用。

public class MethodDemo {
	public static void main(String[] args) {
		eat();
	}
	public static void eat() {
		study();
		System.out.println("吃饭");
		sleep();
	}
	public static void sleep() {
		System.out.println("睡觉");
	}
	public static void study() {
		System.out.println("学习");
	}
}

        现在有三个方法和一个 main 方法。首先会调用 main 方法,main 方法先进栈,然后在 main 方法里调用了 eat 方法,因此 eat 方法第二个进栈;在 eat 方法中,调用了 study 方法, 因此 study 方法第三个进栈,如下:
在这里插入图片描述
        当“学习”打印完以后,study 方法执行完毕,就会出栈:
在这里插入图片描述
然后打印“吃饭”,调 sleep 方法,sleep 方法也会进栈。
在这里插入图片描述
当“睡觉”被打印,sleep 方法也执行完毕,出栈。
在这里插入图片描述
此时发现,eat 方法也执行完毕,因此它也出栈。
在这里插入图片描述
eat 方法执行完后,main 方法也执行完毕,因此出栈,栈空。
在这里插入图片描述

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

        Java 中的数据类型分为基本数据类型引用数据类型
        基本数据类型包括:整数、浮点数、布尔、字符。除此之外的所有数据类型都是引用数据类型。它们最本质的区别是:
在这里插入图片描述
        基本数据类型在内存中,变量存储的是真实的数据。
        而引用数据类型,其存储的是一段地址值,使用了其他空间中的数据,以数组为例:
在这里插入图片描述
在这里插入图片描述
        因此,在传递形参时,如果传递的是数组,它是引用类型,通过修改这个数组,可以直接影响到其指向的地址值所在的堆内存空间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1670822.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习技术之加宽前馈全连接神经网络

深度学习技术 加宽前馈全连接神经网络1. Functional API 搭建神经网络模型1.1 利用Functional API编写宽深神经网络模型进行手写数字识别1.1.1 导入需要的库1.1.2 加载虹膜&#xff08;Iris&#xff09;数据集1.1.3 分割训练集和测试集1.1.4 定义模型输入层1.1.5 添加隐藏层1.1…

值得关注的10种新兴网络安全威胁

随着人类社会的技术、商业和工业活动不断发展&#xff0c;网络犯罪分子也总在寻找更先进的攻击技术和模式。不久前&#xff0c;欧盟网络安全机构&#xff08;ENISA&#xff09;编写发布了《2030年网络安全威胁展望报告》&#xff0c;对未来可能影响数字领域的10种新兴网络安全威…

变频器通过Modbus转Profinet网关接电机与PLC通讯在自动化的应用

Modbus转Profinet网关&#xff08;XD-MDPN100/300/600&#xff09;的作用是将Modbus协议转换为Profinet协议&#xff0c;支持Modbus RTU主站/从站&#xff0c;并且Modbus转Profinet网关设备自带网口和串口&#xff0c;既可以实现协议转换的同时&#xff0c;也可以实现接口的转换…

Diffusion Inversion技术

Diffusion Inversion技术 在图像生成/编辑领域中&#xff0c;Inversion 技术是指将一张&#xff08;真实&#xff09;图片转换为生成模型对应的 latent&#xff0c;要求将这个 latent 输入到生成模型中之后&#xff0c;能够重构出原始图片。这项技术是进行图像编辑的重要基础。…

【触想智能】无风扇工控一体机的优点与定制要求分析

随着工业自动化的不断推进&#xff0c;工控一体机作为自动化生产的核心设备&#xff0c;在工业生产中发挥着越来越重要的作用。 在工控一体机的设计中&#xff0c;散热是一个非常关键的问题&#xff0c;而无风扇工控一体机的出现为解决这个问题提供了新方法。 无风扇工控一体机…

栈结构(详解)

1.栈的概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈&am…

【SAP ABAP学习资料】通过RFC接口上传图片至SAP 图片格式转换 图片大小调整

SAP图片相关&#xff1a; 链接: 【SAP ABAP学习资料】图片上传SAP 链接: 【SAP ABAP学习资料】屏幕图片预览 链接: 【SAP ABAP学习资料】smartforms打印图片&#xff0c;动态打印图片 需求&#xff1a; SAP上传图片只能本地电脑选择图片通过SE78或PERFORM IMPORT_BITMAP_BDS上…

免费的集成组件有哪些?

集成组件是指将多个软件或系统进行整合&#xff0c;以实现更高效、更可靠的数据处理和管理。在数据管理和分析领域&#xff0c;集成组件是不可或缺的工具之一。 在当今高度信息化的时代&#xff0c;集成组件在各行各业的应用中扮演着举足轻重的角色。集成组件能够将不同来源的…

品牌舆情都包含什么内容?建议收藏

一个品牌的声誉、形象、产品质量、服务质量等&#xff0c;无时无刻不在接受着大众的检验。互联网传播迅速&#xff0c;一个不好的舆论直接导致整个品牌的声誉受到严重影响。品牌舆情都包含什么内容&#xff1f;接下来伯乐网络传媒就来给大家讲一讲。 一、品牌舆情的基本构成 1…

局域网语音对讲系统_IP广播对讲系统停车场解决方案

局域网语音对讲系统_IP广播对讲系统停车场解决方案 需求分析&#xff1a; 随着国民经济和社会的发展&#xff0c; 选择坐车出行的民众越来越多。在保护交通安全的同时&#xff0c;也给停车场服务部门提出了更高的要求。人们对停车场系统提出了更高的要求与挑战&#xff0c; 需要…

从XML配置角度理解Spring AOP

1. Spring AOP与动态代理 1.1 Spring AOP和动态代理的关系 Spring AOP使用动态代理作为其主要机制来实现面向切面的编程。这种机制允许Spring在运行时动态地创建代理对象&#xff0c;这些代理对象包装了目标对象&#xff08;即业务组件&#xff09;&#xff0c;以便在调用目标对…

C++11智能指针之一(简介)

1 概述 从C11开始C语言越来向现代化语言转变。尤其是智能指针的引入&#xff0c;代码中不会直接使用new/delete了。C11智能指针有三种分别是&#xff1a;shared_ptr&#xff0c;weak_ptr 和unique_ptr 。 2 类图 3 共享指针(shared_ptr) 接口函数&#xff1a; shared_ptr 构…

华企盾DSC数据防泄密软件有哪些水印功能?

在企业数据安全领域&#xff0c;水印技术是一种重要的信息保护策略&#xff0c;用于防止数据泄露和确保信息的原始性和完整性。根据回顾的资料&#xff0c;以下是企业中常用的几种水印技术&#xff1a; 屏幕浮水印&#xff1a;这种水印能够在用户的屏幕上显示公司的标志或者其他…

【回溯 栈 代数系统 动态规划】282. 给表达式添加运算符

本文涉及知识点 回溯 栈 代数系统 动态规划 LeetCode 282. 给表达式添加运算符 给定一个仅包含数字 0-9 的字符串 num 和一个目标值整数 target &#xff0c;在 num 的数字之间添加 二元 运算符&#xff08;不是一元&#xff09;、- 或 * &#xff0c;返回 所有 能够得到 ta…

【小笔记】neo4j用load csv指令导入数据

【小笔记】neo4j用load csv指令导入数据 背景 很久没有用load CSV的方式导入过数据了因为它每次导入有数量限制&#xff08;印象中是1K还是1W&#xff09;&#xff0c;在企业中构建的图谱往往都是大规模的&#xff0c;此时通常采用的是Neo4j-admin import方式。最近遇到了一些…

HarmonyOS开发案例:【Stage模型下Ability的创建和使用】

介绍 基于Stage模型&#xff0c;对Ability的创建和使用进行讲解。首先在课程中我们将带领大家使用DevEco Studio创建一个Stage模型Ability&#xff0c;并使用UIAbilityContext启动另一个Ability&#xff0c;然后借助Want&#xff0c;在Ability之间传递参数&#xff0c;最后我们…

Redis实战笔记

黑马点评项目笔记 一&#xff1a;数据交互&#xff1a; 1.把String解析成Java对象集合并且存入Redis及Java对象集合转换成JSON。 Overridepublic Result queryTypeList() {String s stringRedisTemplate.opsForValue().get("cache:list:");System.out.println(&qu…

Gitee添加仓库成员

1.进入你的项目 2.点击管理 3.左侧有个仓库管理 4.要加哪个加哪个&#xff0c;有三个方式~ 可以直接添加之前仓库合作过的开发者

【SpringBoot记录】从基本使用案例入手了解SpringBoot-数据访问-更改DataSource(2)

前言 通过上一个数据访问基本案例成功可以发现&#xff0c;SpringBoot在数据访问案例中也做了许多自动配置&#xff0c;上节只分析了其中的Properties。 而在自动配置包的jdbc下 还有其他配置文件。 根据名称可以大致了解他们的作用&#xff1a; DataSourceAutoConfiguration…

前端报错 SyntaxError: Unexpected number in JSON at position xxxx at JSON.parse

问题描述​ 控制台提示 SyntaxError: Unexpected number in JSON at position xxxx at JSON.parse 问题原因​ 原因&#xff1a;JSON 数据格式错误&#xff0c;是否符合 JSON 格式。 解决方法​ 应为json格式数据 什么是json格式数据 JSON&#xff08;JavaScript Object …