【Java 基础】7、学习 Java 中的方法(方法的定义、可变参数、参数的传递问题、方法重载、方法签名)通过官方教程

news/2024/5/5 1:35:42/文章来源:https://blog.csdn.net/m0_54189068/article/details/126639432

💰 写了一段时间的 Java 程序,SpringBoot 🍃项目也做了好几个,但感觉自己对 Java 的了解还是特别少,所以决定从🍼开始重新学习,下面是学习的笔记。【学习素材:韩顺平老师】

💰 我会把我的学习过程分为六个阶段:
🍎① Java 和基于 Java 的编程基础(包括 Java 的基本介绍、变量和运算符、程序控制结构、数组、排序、查找)
🍉② Java 的面向对象编程详解
🍏③ 枚举注解、异常、常用类
🍓④ 集合、泛型、多线程
🍑⑤ IO 流和网络编程
🍍⑥ 反射和正则表达式

文章目录

  • 一、方法(Method)概念
  • 二、可变参数(Variable)
  • 三、方法的参数传递问题
    • 1. 基本数据类型
    • 2. 引用数据类型
  • 四、方法签名(Method Signature)
  • 五、方法的重载(Overload)

一、方法(Method)概念

✏️ 1、Java 中的方法就是其他编程语言中的函数(Function)
✏️ 2、方法的定义格式:
在这里插入图片描述

📚 ① 访问修饰符有4种:public、protected、default、private【后期会详细说明
📚 ② 返回值类型可能是8大基本数据类型、引用类型或无返回值(void
📚 ③ 方法名需符合标识符命名规范、方法名需见名知意、方法名需是小驼峰(类名是大驼峰)
📚 ④ 参数列表是该方法需要调用者传入的值(包括参数类型和参数名)【后期会详细说明
📚 ⑤ 方法体中才可编写 Java 语句(并不是所有花括号中都是方法体:如类定义的花括号中不是方法体)

下面是方法体代码案例:

public class MethodBody {// 1.代码块{System.out.println("【{}】是方法体");}// 2.静态代码块static {System.out.println("【static {}】是方法体");}// 3.方法public void run(int age) {System.out.println("方法的花括号中是方法体");// 4.ifif (age == 18) {System.out.println("if 语句的花括号中是方法体");}// 5.forfor (int i = 0; i < age; i++) {System.out.println("for 循环的花括号中是方法体");}// 6.whilewhile (age > 50) {System.out.println("while 循环的花括号中是方法体");}// 7.switch-caseswitch (age) {// 错误:在该区域写代码是错误的(该区域不是方法体)// System.out.println(age); // ERRORcase 1: {System.out.println("switch 语句的 case 语句块是方法体");}}// 8.do-whiledo {System.out.println("do-while 循环的花括号中是方法体");} while (age < 5);}}

其实可以理解为只有三个地方是代码块:
⭐️ ① 代码块
⭐️ ② 静态代码块
⭐️ ③ 方法中
但是,当初老师教的时候把 if、while、for 等也归纳为方法体

在这里插入图片描述
🌱 补充:定义方法可能还会有其他修饰符(eg:static、final、abstract),后面还会详细介绍

仔细看下面的代码, 学会定义方法:

public class CreateMethodDemo {public static void main(String[] args) {int sum1 = CreateMethodDemo.sumOne2Hundred(1, 100);// sum1 = 5050System.out.println("sum1 = " + sum1);int sum2 = CreateMethodDemo.sumOne2Hundred(1, 1000);// sum2 = 500500System.out.println("sum2 = " + sum2);int sum3 = CreateMethodDemo.sumOne2Hundred(1, 10000);// sum3 = 50005000System.out.println("sum3 = " + sum3);}/*** 计算[start, end]的累加和** @param start 起始值* @param end   结束值* @return [start, end]的累加和*/private static int sumOne2Hundred(int start, int end) {int sum = 0;for (int i = start; i <= end; i++) {sum += i;}return sum;}}

在这里插入图片描述

二、可变参数(Variable)

思考:编写程序计算多个整数的和。eg:计算【2, 5, 6, 7, 66, 53】的和

public class VariableParameter {public static void main(String[] args) {int[] arr = {2, 5, 6, 7, 66, 53};VariableParameter vp = new VariableParameter();// sumByArr = 139System.out.println(vp.sumByArr(arr));}/*** 计算多个整数的和(通过数组)** @param arr (数组中存放需要进行求和的多个整数)* @return 数组中多个整数的和(类型是字符串)*/private String sumByArr(int[] arr) {if (arr == null || arr.length < 1) return "arr 数组为 null, 为数组元素为 0";int sum = 0;for (int i = 0; i < arr.length; i++) {sum += arr[i];}return "sumByArr = " + sum; }}

思路1:
🌟 可把需要进行求和的整数放入一个整型数组中,并把整型数组作为参数传给 sumByArr 方法
🌟 sumByArr 方法接收一个 int 类型的数组作为参数,在 sumByArr 的方法体中通过 for 循环遍历数组中的数字,并进行求和
思路2:
🌻 使用可变参数替换 arr 数组

public class VariableParameter {public static void main(String[] args) {VariableParameter vp = new VariableParameter();// 当 sumByVariable1Parameter 的参数列表中一个【值】都没有// 的时候, 返回值是可变参数类型的默认值int sum = vp.sumByVariable1Parameter(2, 5, 6, 7, 66, 53);// sumByVariable1Parameter = 139System.out.println("sumByVariable1Parameter = " + sum);}/*** 计算多个整数的和(通过可变参数)** @param nums (参数列表中可以放多个需要进行求和的整数)* @return 参数列表中多个整数的和(类型 int)*/private int sumByVariable1Parameter(int... nums) {int sum = 0;for (int i = 0; i < nums.length; i++) {sum += nums[i];}return sum;}}

☘️ 可变参数的本质是数组
☘️ 可变参数必须是方法的参数列表中的最后一个参数

在这里插入图片描述

☘️ String 类有静态方法 format 可用于拼接字符,它的底层就用到了【可变参数】

public class VariableParameter {public static void main(String[] args) {String info = String.format("name: %s; age: %d; money: %f", "庆医", 10, 895863.99);// info = name: 庆医; age: 10; money: 895863.990000System.out.println("info = " + info);}}

三、方法的参数传递问题

1. 基本数据类型

Passing Primitive Data Type Arguments 传递原始数据类型参数

🌱 基本类型作为参数是值传递
🌱 基本类型作为返回值,返回的是值本身
🌱 基本类型:byte、short、int、long、float、double、boolean、char

Primitive arguments, such as an int or a double, are passed into methods by value. This means that any changes to the values of the parameters exist only within the scope of the method. When the method returns, the parameters are gone and any changes to them are lost.

原始参数(eg:int 或 double)通过 value 传递给方法。这意味着对参数值的任何更改仅存在于该方法的作用域内。当方法返回后,栈帧销毁后,参数消失后,对它们的任何更改都将无效。

public class ArgumentsPassingTest {public static void main(String[] args) {int n = 10;test(n); // 值传递(v 和 n 没有关系)// n = 10System.out.println("n = " + n);}private static void test(int v) { // v = 10v = 20;}}

基本类型作为返回值,返回的是值本身:

public class ArgumentsPassingTest {public static void main(String[] args) {int test = test(66);// test = 88System.out.println("test = " + test);}private static int test(int param) {param = 88;return param;}}

2. 引用数据类型

Passing Reference Data Type Arguments(传递引用数据类型参数)

🌱 引用类型作为参数是引用传递(地址传递)
🌱 引用类型作为返回值是引用传递(地址传递

Reference data type parameters, such as objects, are also passed into methods by value. This means that when the method returns, the passed-in reference still references the same object as before. However, the values of the object’s fields can be changed in the method, if they have the proper access level.
引用数据类型参数(例如对象)也按值传递给方法。这意味着当方法返回时,传入的引用仍然引用着与之前相同的对象。但是,如果对象字段的值具有适当的访问级别,则可以在方法中更改它们。

public class ArgumentsPassingTest {public static void main(String[] args) {int[] nums = {1, 2, 3};test(nums);// nums = [1, 66, 3]System.out.println("nums = " + Arrays.toString(nums));}private static void test(int[] param) {param[1] = 66;}}

在这里插入图片描述
引用类型作为返回值是引用传递(地址传递):

public class ArgumentsPassingTest {public static void main(String[] args) {int[] test = test();// test = [1314, 520, 666]System.out.println("test = " + Arrays.toString(test));}private static int[] test() {int[] ints = {1314, 520, 666};return ints;}}

栈帧销毁销毁的是局部变量信息,堆空间的对象不会被回收的。

四、方法签名(Method Signature)

🌼 方法签名只由2部分组成:方法名、参数类型

private static void test(double pai, String name, int age) {return null;
}

🌼 上面方法的方法签名是:test(double, String, int)
🌼 在同一个类中,方法签名是唯一的(同一方法签名在同一个类中只能出现一次)

五、方法的重载(Overload)

🌾 官方教程:
Overloaded(重载) methods are differentiated by the number and the type of the arguments passed into the method. For example: run(String s) and run(int i) are distinct and unique methods because they require different argument types.

重载的方法通过传递给方法的参数的数量和类型来区分。
例如:run(String s)run(int i) 是不同且独特的方法,因为它们拥有不同的参数类型

🌾 重载:① 方法名相同,参数类型或数量不同;② 重载与返回值类型、参数名称无关

The compiler does not consider return type when differentiating methods, so you cannot declare two methods with the same signature even if they have a different return type.
编译器在区分方法时不考虑返回类型,因此即使它们具有不同的返回类型,也不能声明具有相同签名的两个方法。

You cannot declare more than one method with the same name and the same number and type of arguments, because the compiler cannot tell them apart.
您不能声明多个具有相同名称和相同数量和类型的参数的方法,因为编译器无法区分它们。

下面的两个方法构成方法重载:

private static int[] test(double weight, String name, int age) {return null;
}private static int[] test(int age, double weight, String name) {return null;
}

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

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

相关文章

docker 安装 elasticsearch

一、安装docker Docker 的安装_傲傲娇的博客-CSDN博客 二、配置es挂载文件和目录 mkdir -p /opt/elasticsearch/{config,data,plugins} chmod 777 /opt/elasticsearch/data 在config目录下创建elasticsearch.yml配置文件 cluster.name: elasticsearch-cluster # 节点名称 n…

【MC教程】iPad启动Java版mc(无需越狱)(保姆级?) Jitterbug启动iOS我的世界Java版启动器 PojavLauncher

【MC教程】iPad启动Java版mc&#xff08;无需越狱&#xff09;(保姆级?) Jitterbug启动iOS我的世界Java版启动器 PojavLauncher 文章目录【MC教程】iPad启动Java版mc&#xff08;无需越狱&#xff09;(保姆级?) Jitterbug启动iOS我的世界Java版启动器 PojavLauncher前言iSign…

springmvc实现文件上传书本管理CRUD

今天小编给大家分享文件上传&#xff0c;和对书本管理进行新增、修改、删除、查询。 效果展示 首页 新增 修改 一、书本管理CRUD 1.开发前必做的配置 1.1 导入pom.xml文件依赖 实现CRUDspringmvc的jar包 <dependency><groupId>org.springframework</groupId…

3.实现redis哨兵,模拟master故障场景

3.实现redis哨兵,模拟master故障场景 实验拓扑图 3.1 哨兵的准备实现主从复制架构 哨兵的前提是已经实现了一个redis的主从复制的运行环境,从而实现一个一主两从基于哨兵的高可用redis架构。 注意: master 的配置文件中的masterauth 和slave的都必须相同 所有主从节点的redis…

小波神经网络的基本原理,小波神经网络功能分析

小波神经网络的优势是什么&#xff1f;谢谢 小波神经网络相比于前向的神经网络,它有明显的优点:首先小波神经网络的基元和整个结构是依据小波分析理论确定的,可以避免BP神经网络等结构设计上的盲目性;其次小波神经网络有更强的学习能力,精度更高。 总的而言&#xff0c;对同样…

数据结构初步(一)- 时间与空间复杂度

目录前言1. 数据结构与算法1.1 数据结构是啥1.2 算法是啥2. 算法效率2.1 如何衡量一个算法的效率2.2 算法的复杂度3. 时间复杂度3.1 概念3.2 大O的渐进表示法3.3 例子分析计算Func2的时间复杂度计算Func3的时间复杂度计算Func4的时间复杂度计算strchr的时间复杂度计算冒泡排序的…

端口号被占用解决办法(超详细)

文章目录问题描述java.net.BindException: Address already in use: JVM_BindWeb server failed to start. Port 8899 was already in use.解决方案问题描述 java.net.BindException: Address already in use: JVM_Bind Web server failed to start. Port 8899 was already in…

极几何,本质矩阵,基础矩阵,单应矩阵

什么是三角化&#xff1f; 三角化就是下图的红字部分&#xff1a; 什么是极几何&#xff1f; 极几何描述了同一场景或者物体在两个视点图像间的对应关系。 下图中的O1和O2分别是两个相机的光心&#xff0c;即摄像机坐标系的原点。由下图可知给定了一个三维空间下的P点&…

07-Linux基本权限

1. 权限基本概述 1.1 什么是权限&#xff1f; 权限: 操作系统对用户能够执行的功能所设立的限制, 主要用于约束用户能对系统所做的操作, 以及内容访问的范围, 或者说, 权限是指某个特定的用户具有特定的系统资源使用权力.1.2 为什么要有权限&#xff1f; 因为系统中不可能只…

最详解消息队列以及RabbbitMQ之HelloWorld

1、消息队列 1、MQ的相关概念 1、什么是MQ MQ(message queue)&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO 先入先出&#xff0c;只不过队列中存放的内容是message 而已&#xff0c;还是一种跨进程的通信机制&#xff0c;用于上下游传递消息。 在互联…

webpack中的插件

1.webpack插件的作用通过安装和配置第三方插件,可以拓展webpack的能力,从而让webpack用起来更方便。最常用的webpack插件如下有两个:webpack-dev-server 类似于node.js阶段用到的nodemon工具 每当修改了源代码,webpack会自动进行项目的打包和构建html-webpack-pluginwebpac…

(分布式缓存)Redis哨兵

对应的教程视频&#xff1a; 高级篇Day3-03-Redis哨兵_哔哩哔哩_bilibili 目录&#xff1a; 哨兵的作用和原理搭建哨兵集群RedisTemplate的哨兵模式 一、哨兵的作用和原理 二、搭建哨兵集群 1.集群结构 这里我们搭建一个三节点形成的Sentinel集群&#xff0c;来监管之前的Re…

C++版本的OpenCV 5.x编译生成opencv-python==5.x(GPU版本)接口并进行调用

实现文章连接&#xff1a;强力推荐】基于Nvidia-Docker-Linux(Ubuntu18.04)平台&#xff1a;新版OpenCV5.x(C)联合CUDA11.1(GPU)完美配置视觉算法开发环境 目录1、关于有粉丝私信问我怎么调用的问题2、opencv5.x&#xff08;GPU&#xff09;测试成功opencv-python5.x测试代码Op…

黑马C++ 02 核心6 —— 类和对象_继承(重难点)

文章目录1.1 继承基本语法普通实现(重复率高)继承实现(减少重复代码)1.2 继承方式公共继承保护继承私有继承1.3 继承中的对象模型1.4 继承中构造与析构顺序1.5 继承同名成员处理方法同名成员属性同名成员函数1.6 继承同名静态成员处理方式1.6.1 同名静态成员属性通过对象访问通…

第9章 Spring的数据库编程

目录/Contents第9章 Spring的数据库编程学习目标学习内容1 Spring JDBC1.1 JDBCTemplate概述1.1.1 JDBCTemplate作用1.1.2 抽象类JdbcAccessor的属性1.2 Spring JDBC的配置1.2.1 Spring JDBC中的4个包说明1.2.2 dataSource配置4个属性的含义1.2.3 dataSource属性值的设定要求2 …

【中秋怎么过】许一个愿,希望成都不要在静默管理中过中秋

今年的中秋又要到啦&#xff0c;诚邀亲爱的博主参与投稿&#xff0c;分享“程序员”视角下的中秋夜之美&#xff01; 内容可以是&#xff1a; 程序员过中秋的正确方式&#xff1a;团圆、赏月、还是惨兮兮地加班&#xff1f;互联网大厂的中秋仪式感&#xff1a;壕无人性&#…

嵌入式Linux入门-Linux文件IO讲解并实现copy程序

嵌入式Linux入门学习教程汇总&#xff1a;嵌入式Linux教程—裸机、应用、驱动完整教程目录 在Linux系统中&#xff0c;一切都是“文件”&#xff1a;普通文件、驱动程序、网络通信等等。所有的操作&#xff0c;都是通过“文件IO”来操作的。 IO就是input和output&#xff0c;…

[PostgreSQL的 SPI_接口函数]

Server Programming Interface&#xff08;SPI&#xff09;是PostgreSQL内核中的一个模块&#xff0c;这个模块让内核开发者可以在C函数中执行SQL语句&#xff0c;并具备管理事务的能力。通过它我们可以用C语言去调用数据库里的各种SQL。 这个SPI_比较便利的一点在于&#xff…

如何使用 Bootstrap 处理 CSS

如何使用 Bootstrap 处理 CSS 大家好!如果您像我一样开始使用 CSS 编码并使用它进行任何大型项目,那么您肯定会因为响应式布局、溢出和选择器特异性而感到数不清的头痛。这就是几周前我决定学习 Bootstrap 的原因,这里是它的文档和主要功能的简短描述,所以你也可以。引导程…

一、Azkaban简明笔记

1、azkaban部署 主要是集群部署安装。 1.1 准备安装包Downloads (azkaban.github.io)1.2 配置MySQL启动mysql mysql -uroot -proot创建azkaban数据库 create database azkaban;创建azkaban用户并赋予权限(可以不设置账号,继续使用root账号) -- 显示相关变量 SHOW VARIABLES …