【JAVA入门】Day04 - 方法

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

3W 3KVAC隔离 宽电压输入 AC/DC 电源模块——TP03AL系列

TP03AL系列产品具有交直流两用、输入电压范围宽、高可靠性、低功耗、安全隔离等优点。广泛适用于工控和电力仪器仪表、智能家居等对体积要求苛刻、并对EMC 要求不高的场合&#xff0c;如果需要应用于电磁兼容恶劣的环境下必须添加EMC 外围电路。

保研机试之【x86/x86-64体系结构中的寄存器】

先来看一下这六个选项的功能&#xff1a; 举一个例子&#xff1a; 对于CR2寄存器和中断向量表&#xff1a; 也就是先通过CR2寄存器找到引发错误的虚拟地址&#xff0c;然后操作系统分析错误原因&#xff0c;通过IDTR寄存器找到IDT&#xff08;中断向量表&#xff09;&#xff0…

Rust 中的mod 使用

1、本文将展示在Rust语言中如何引入模块。 2、项目目录如下图。 2.1、mod.rs中是需要引入的模块代码。 2.2、main.rs和文件夹utils在src文件夹下。 2.3、mod.rs代码如下。 pub mod nation{pub mod government{pub fn govern(){let aString::from("govern");println…

代码随想录算法训练营Day 38| 动态规划part01 | 理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

代码随想录算法训练营Day 38| 动态规划part01 | 理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯 文章目录 代码随想录算法训练营Day 38| 动态规划part01 | 理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯理论基础一、常规题目二、解题步骤…

代码随想录算法训练营第二十七天|​回溯法理论基础​、第77题. 组合

理论基础 回溯法基本介绍 回溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式。 回溯是递归的副产品&#xff0c;只要有递归就会有回溯。递归函数的下面就是回溯的逻辑 因为回溯的本质是穷举&#xff0c;穷举所有可能&#xff08;暴力法&#xff09;&#xff0c;然…

Today At Apple 2024.04.15 Phone15 入门

官网&#xff1a; https://www.apple.com/today/Apple 亚洲第一大商店&#xff1a;Apple 静安零售店现已在上海开幕如下预约课程&#xff1a;下载 Apple Store&#xff08;不是app store&#xff09;&#xff0c;点击课程预约笔记&#xff1a;Today At Apple Notes果粉加群 &am…

并发编程总结(二)

目录 Java 对象头 wait / notify sleep(long n) 和 wait(long n) 的区别 死锁 定位死锁 饥饿 ReentrantLock Java 对象头 以 32 位虚拟机为例 64 位虚拟机 Mark Word 在程序中查看对象结构&#xff1a; 导入依赖&#xff1a; <!-- https://mvnrepository.com/artifac…

掌握这个Jenkins插件,离测试开发又近一步!

Jenkins Pipeline是一种可编程的、可扩展的持续交付管道&#xff0c;允许您使用脚本来定义整个软件交付过程。 以下是使用Jenkins Pipeline创建和配置流水线的基本步骤。 Part 01. 创建一个Pipeline Job 在Jenkins中创建一个新的"Pipeline"类型的Job。 以下是在J…

解决宝塔Nginx和phpMyAdmin配置端口冲突问题

问题描述 在对基于宝塔面板的 Nginx 配置文件进行端口修改时&#xff0c;我注意到 phpMyAdmin 的端口配置似乎也随之发生了变化&#xff01; 解决方法 官方建议在处理 Nginx 配置时&#xff0c;应避免直接修改默认的配置文件&#xff0c;以确保系统的稳定性和简化后续的维护…

简单问题汇总

一、vector和list 1.vector vector是可变大小数组的序列容器&#xff0c;拥有一段连续的内存空间&#xff0c;并且起始地址不变&#xff0c;因此能高效的进行随机存取&#xff0c;时间复杂度为o(1)&#xff1b;但因为内存空间是连续的&#xff0c;所以在进行插入和删除操作时…

触摸OpenNJet,云原生世界触手可及

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” 文章目录 导言OpenNJet云原生引擎介绍云原生平台的介绍优化与创新 为什么选择OpenNJet云原生引擎如何在windo…

【MATLAB源码-第207期】基于matlab的单相光伏并网系统仿真,并网策略采用基于扰动观测法的MPPT模型和使用电压电流双闭环SPWM控制。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 本文将重点分析光伏发电最大功率点跟踪&#xff08;MPPT&#xff09;技术和逆变器的并网控制技术&#xff0c;并在Simulink环境下建立模拟系统&#xff0c;以体现这些技术的应用与效果。文章结构如下&#xff1a;首先简介光伏…

class常量池、运行时常量池和字符串常量池的关系

类常量池、运行时常量池和字符串常量池这三种常量池&#xff0c;在Java中扮演着不同但又相互关联的角色。理解它们之间的关系&#xff0c;有助于深入理解Java虚拟机&#xff08;JVM&#xff09;的内部工作机制&#xff0c;尤其是在类加载、内存分配和字符串处理方面。 类常量池…

【java9】java9新特性概述

经过4次的跳票&#xff0c;历经曲折的Java9最终在2017年9月21日发布。因为里面加入的模块化系统&#xff0c;在最初设想的时候并没有想过那么复杂&#xff0c;花费的时间超出预估时间。距离java8大约三年时间。 Java9提供了超过150项新功能特性&#xff0c;包括备受期待的模块…

sql注入---sqli靶场

1.什么是SQL注入 SQL注入是比较常见的网络攻击方式之一&#xff0c;它不是利用操作系统的BUG来实现攻击&#xff0c;而是针对程序员编写时的疏忽&#xff0c;通过SQL语句&#xff0c;实现无账号登录&#xff0c;甚至篡改数据库 2.sql注入原理 攻击者注入一段包含注释符的SQL语…

软件2班20240513

第三次作业 package com.yanyu;import java.sql.*; import java.util.ResourceBundle;public class JDBCTest01 {public static void main(String[] args) {ResourceBundle bundle ResourceBundle.getBundle("com/resources/db");// ctrl alt vString driver …

WebSocket建立网络连接——小案例

WebSocket是一种实现全双工通信的网络技术标准&#xff0c;它允许在用户的浏览器和服务器之间进行持久的、双向的通信。以下是对WebSocket的具体介绍&#xff1a; 实时性&#xff1a;与传统HTTP请求相比&#xff0c;WebSocket提供了更高效的实时数据交换方式。一旦建立连接&am…

极限基本思想

极限基本思想 在高等数学中极限是微积分的前置思想&#xff0c;没有极限的概念&#xff0c;那么微积分的理论将不复存在。极限也用于分析一个函数的连续性&#xff0c;可以说理解极限后理解函数的连续问题是轻而易举的事情。对于函数的连续性&#xff0c;不是什么高深的词汇就…

点云分割论文阅读01--FusionVision

FusionVision: A Comprehensive Approach of 3D Object Reconstruction and Segmentation from RGB-D Cameras Using YOLO and Fast Segment Anything FusionVision&#xff1a;使用 YOLO 和 Fast Segment Anything 从 RGB-D 相机重建和分割 3D 对象的综合方法 toread&#x…

linux笔记5--shell命令2

文章目录 一. linux中的任务管理1. 图形界面2. 命令① top命令② grep命令③ ps命令补充&#xff1a; ④ kill命令图形界面杀死进程 二. 挂载(硬盘方面最重要的一个知识点)1. 什么是挂载2. 关于挂载目录① Windows② linux查看硬件分区情况(/dev下)&#xff1a;更改挂载目录结束…