【JavaSE笔记】方法

news2024/11/25 22:43:27

一、前言

Java中的方法是一种在Java编程中非常常见的概念。

我们可以将方法看作是一种可重复使用的代码块,类似于生活中的工具。就像我们在日常生活中会使用各种各样的工具来完成不同的任务一样,我们在编程中也可以使用方法来完成各种不同的操作。

二、方法的概念和使用

1、什么是方法

方法就是一个代码片段.。类似于 C 语言中的 “函数”。方法允许我们将代码进行组织和封装,这有助于提高代码的可读性、可重用性和可维护性。方法可以接受参数,执行一系列操作,并返回一个结果。

方法存在的意义:

  • 是能够模块化的组织代码(当代码规模比较复杂的时候).

  • 做到代码被重复使用, 一份代码可以在多个位置使用.

  • 让代码更好理解更简单.

  • 直接调用现有方法开发, 不必重复造轮子

2、方法的定义

修饰符 返回值类型 方法名称(方法参数列表) {
    // 方法体(method body)
    // 包含实现特定任务的代码
}

例如:写一个方法求两个整数的和

public static int addNumbers(int num1, int num2) {
    int sum = num1 + num2;
    return sum;
}

【注意事项】

  • 修饰符:现阶段直接使用public static 固定搭配

  • 返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成void

  • 方法名字:采用小驼峰命名

  • 参数列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开

  • 方法体:方法内部要执行的语句

  • 在java当中,方法必须写在类当中

  • 在java当中,方法不能嵌套定义

  • 在java当中,没有方法声明一说(C语言需要进行方法声明)

3、方法调用的过程

调用方法—>传递参数—>找到方法地址—>执行被调方法的方法体—>被调方法结束返回—>回到主调方法往下执行

public class Method {
        public static void main(String[] args) {
            int a = 10;
            int b = 20;
            System.out.println("第一次调用方法之前");
            int ret = add(a, b);
            System.out.println("第一次调用方法之后");
            System.out.println("ret = " + ret);
            System.out.println("第二次调用方法之前");
            ret = add(30, 50);
            System.out.println("第二次调用方法之后");
            System.out.println("ret = " + ret);
        }
        public static int add(int x, int y) {
            System.out.println("调用方法中 x = " + x + " y = " + y);
            return x + y;
        }
    }

image-20230628111709248

方法的调用,每次都会在栈上开辟内存!

image-20230628112640799

4、实参和形参的关系

方法的形参相当于数学函数中的自变量
1 + 2 + 3 + … + n 的公式为: s u m ( n ) = n ∗ ( n + 1 ) / 2 1 + 2 + 3 + … + n的公式为:sum(n) = n*(n+1)/ 2 1+2+3++n的公式为:sum(n)=nn+1/2
**Java中方法的形参就相当于sum函数中的自变量n,用来接收sum函数在调用时传递的值的。**形参的名字可以随意

取,对方法都没有任何影响,形参只是方法在定义时需要借助的一个变量,用来保存方法在调用时传递过来的值

public static int add(int a, int b){
return a + b;
}
add(2, 3); // 2和3是实参,在调用时传给形参a和b

image-20230628113917705

注意:在Java中,实参的值永远都是拷贝到形参中,形参和实参本质是两个实体

举个例子:

public class TestMethod {
public static void main(String[] args) {
    int a = 10;
    int b = 20;
    swap(a, b);
    System.out.println("main: a = " + a + " b = " + b);
   }
public static void swap(int x, int y) {
    int tmp = x;
    x = y;
    y = tmp;
    System.out.println("swap: x = " + x + " y = " + y);
   }
}
// 运行结果
swap: x = 20 y = 10
main: a = 10 b = 20

swap函数交换之后,形参x和y的值发生了改变,但是main方法中a和b还是交换之前的值,即没有交换成功。那么为什么呢?

实参a和b是main方法中的两个变量,其空间在main方法的栈(一块特殊的内存空间)中,而形参x和y是swap方法中的两个变量,x和y的空间在swap方法运行时的栈中。因此:实参a和b 与 形参x和y是两个没有任何关联性的变量,在swap方法调用时,只是将实参a和b中的值拷贝了一份传递给了形参x和y,因此对形参x和y操作不会对实参a和b产生任何影响。对于基础类型来说, 形参相当于实参的拷贝,即 传值调用

解决办法】: 传引用类型参数 (例如使用数组来解决这个问题)

public static void swap(int[] arr) {
    int tmp = arr[0];
    arr[0] = arr[1];
    arr[1] = tmp;
}

三、方法重载

1、函数重载的概念

在自然语言中,经常会出现“一词多义”的现象,比如:“好人”。

image-20230628122141474

在自然语言中,一个词语如果有多重含义,那么就说该词语被重载了,具体代表什么含义需要结合具体的场景。在Java中方法也是可以重载的。

在Java中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了

public class TestMethod {
  public static void main(String[] args) {
    add(1, 2); // 调用add(int, int)
    add(1.5, 2.5); // 调用add(double, double)
    add(1.5, 2.5, 3.5); // 调用add(double, double, double)
  }
  public static int add(int x, int y) {
	return x + y;
  }
  public static double add(double x, double y) {
	return x + y;
  }
  public static double add(double x, double y, double z) {
	return x + y + z;
  }
}

【注意】

  • 方法名必须相同

  • 参数列表必须不同(参数的个数不同、参数的类型不同、类型的次序必须不同)

  • 与返回值类型是否相同无关

  • 两个方法如果仅仅只是因为返回值类型不同,是不能构成重载的

  • 编译器在编译代码时,会对实参类型进行推演,根据推演的结果来确定调用哪个方法

2、方法签名

在同一个作用域中不能定义两个相同名称的标识符。

比如:方法中不能定义两个名字一样的变量,那为什么类中就可以定义方法名相同的方法呢?

方法签名即:经过编译器编译修改过之后方法最终的名字。具体方式:方法全路径名+参数列表+返回值类型,构成方法完整的名字。

public class TestMethod {
public static int add(int x, int y){
return x + y;
}
public static double add(double x, double y){
return x + y;
}
public static void main(String[] args) {
add(1,2);
add(1.5, 2.5);
}
}

上述代码经过编译之后,然后使用JDK自带的javap反汇编工具查看,具体操作:

  1. 先对工程进行编译生成.class字节码文件

  2. 在控制台中进入到要查看的.class所在的目录

  3. 输入:javap -v 字节码文件名字即可

image-20230628125355312

方法签名中的一些特殊符号说明:

image-20230628125419557

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

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

相关文章

如何去掉word上方页眉处的横线

一、问题描述 有时候word总会莫名其妙在页眉处出现一条横线,如图: 二、解决步骤 1.首先点击任一页眉进入页眉编辑状态,然后点击设计: 2.选择页面边框: 3.选择边框——选择无——选择应用于段落——完成。

基于matlab实现的额 BP神经网络电力系统短期负荷预测未来(对比+误差)完整程序分享

基于matlab实现的额 BP神经网络电力系统短期负荷预测 完整程序: clear; clc; %%输入矢量P(15*10) P[0.2452 0.1466 0.1314 0.2243 0.5523 0.6642 0.7105 0.6981 0.6821 0.6945 0.7549 0.8215 0.2415 0.3027 0; 0.2217 0.1581 0.1408 0.23…

Java基础(二十五):JDBC

文章目录 一、JDBC1.1 概述1.2 快速入门 二、获取数据库连接的5种方式三、ResultSet四、Statement与PreparedStatement4.1 Statement存在SQL注入4.2 PreparedStatement 五、JDBC API六、事务七、批处理八、数据库的连接方式8.1 传统的连接方式8.2 数据库的连接池技术8.2.1 C3P0…

OpenCV项目实战(2)— 如何用OpenCV实现弹球动画

前言:Hello大家好,我是小哥谈。OpenCV能够在画布上绘制静态的图形,例如,线段、矩形、正方形、圆形、多边形、文字等。那么,能不能让这些静态的图形移动起来?如果能,又该如何编写代码呢&#xff…

S7-1200PLC硬件上升沿中断(VN积分法计算实时卷径)

VN积分法计算实时卷径的算法原理请参考下面文章链接: VN积分法卷径计算FB(SCL代码)_RXXW_Dor的博客-CSDN博客卷径计算的其他方法请参看专栏的相关文章,链接如下:卷径计算(V/N法)_RXXW_Dor的博客-CSDN博客。https://rxxw-control.blog.csdn.net/article/details/131612206PL…

八月 NFT 行业解读:数据下滑,熊市持续

作者: stellafootprint.network 8 月份,加密货币市场经历了明显的波动,比特币价格波动幅度较大。与此同时,NFT 市场出现大幅下跌,引发了人们对这一新兴行业未来发展趋势的担忧。 我们是否已经到达熊市的底部?行业利好…

JDK8 升级至JDK19

优质博文IT-BLOG-CN 目前部分项目使用JDK8,部分项目使用JDK19因此,环境变量中还是保持JDK8,只需要下载JDK19免安装版本,通过配置IDEA就可以完成本地开发。 一、IDEA 环境设置 【1】通过快捷键CTRL SHIFT ALT S或者File->P…

Network: use --host to expose

Network: use --host to expose vite 项目启动后 只能通过 localhost 访问 无法使用 IP 地址访问 原因因为 没有将网络服务暴露在网络中 vite 项目启动 出现如下图 提示: 注意这条提示: Network: use --host to expose 没有将网络服务暴露在网络中 所以 …

【数据结构】用3500字学会优先级队列(堆)

文章目录 💐1. 优先级队列1.1 概念 💐2.堆的概念及存储方式2.1 什么是堆2.2 为什么要用完全二叉树描述堆呢?2.3 为什么说堆是在完全二叉树的基础上进行的调整?2.4 使用数组还原完全二叉树 💐3. 堆的常用操作-模拟实现3…

【CMU 15-445】Proj0 C++ Primer

C Primer Task1 Copy-On-Write TrieTask2 Concurrent Key-Value StoreTask3 DebuggingTask4 SQL String Functions CMU-15445汇总 本文对应的project版本为CMU-Spring-2023的project0 默认读者已经学会了字典树Trie Task1 Copy-On-Write Trie Task1要求实现一个可持久化字典树…

邀请加入团队

**将地址发送给同团队的人克隆失败 ** —解决办法 邀请加入团队 在这里插入图片描述

港科夜闻|香港科大2020十大准独角兽开思完成2亿元D2,D3轮融资,推进汽后全产业链数字化转型...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、“香港科大2020十大准独角兽”开思完成2亿元D2,D3轮融资,推进汽后全产业链数字化转型。开思一直致力于为汽车后市场打造数字化基础设施,建设行业服务标准与信用体系,其业务涵盖一站式汽…

Hive内置函数字典

写在前面:HQL同SQL有很多的类似语法,同学熟悉SQL后一般学习起来非常轻松,写一篇文章列举常用函数,方便查找和学习。 1. 执行模式 1.1 Batch Mode 批处理模式 当使用-e或-f选项运行$ HIVE_HOME / bin / hive时,它将以…

【ChatGPT原理与实战】4个维度讲透ChatGPT技术原理,揭开ChatGPT神秘技术黑盒!

🚀欢迎来到本文🚀 🍉个人简介:陈童学哦,目前学习C/C、算法、Python、Java等方向,一个正在慢慢前行的普通人。 🏀系列专栏:陈童学的日记 💡其他专栏:CSTL&…

三个激活函数在同一figure上的实现

######后期会更新 import matplotlib.pyplot as plt from matplotlib.pyplot import MultipleLocator import numpy as np import mathplt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False# sigmoid激活函数用的最少,但为二分类问题…

零基础VB6无壳P-CODE逆向分析(VB Decompiler应用与避坑)

> 前言 最近从朋友那里拿到了一个加密狗授权的软件安装包,秉承着LCG的精神,开启了逆向之路,经过查壳和综合分析确定是VB6编写的程序(这年头使用VB6开发商业程序的还真少见),作为一名C# Winform的业余程序员,靠着C#的知识勉强分析个大概. > 授权简介 软件共分三种授权模…

Flex布局详解

目录 一、Flex 布局是什么? 二、基本概念 三、容器的属性 3.1 flex-direction属性 3.2 flex-wrap属性 3.3 flex-flow 3.4 justify-content属性 3.5 align-items属性 3.6 align-content属性 四、项目的属性 4.1 order属性 4.2 flex-grow属性 4.3 flex-s…

基于Python+Flask实现一个TODO任务管理系统网站

随着科技的进步,数字化的任务清单逐渐成为生活中不可或缺的一部分。它们不仅可以帮助我们跟踪日常任务,还可以提高效率。但是,你是否考虑过自己制作一个任务管理系统呢? 好消息是,使用Python和Flask,我们可…

数据库安全(Mysql,Hadoop,Redis)

MySQL Mysql 身份认证绕过漏洞(CVE-2012-2122) 当连接MariaDB/MySQL时,输入的密码会与期望的正确密码比较,由于不正确的处理,会导致即便是memcmp()返回一个非零值,也会使MySQL认为两个密码是相同的。也就…

C++:初始化列表,static成员,友元,内部类

个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C》 文章目录 前言一、初始化列表二、static成员三、友元四、内部类总结 前言 本篇博客作为C:初始化列表,static成员,友元,内部类的知识总结。 一…