【Java08】方法(上)

news2024/11/23 7:13:28

从面向对象的角度来看,Java中的方法是类或对象行为的抽象。但和C++不同,Java中”剔除“了C++中”残留“的结构化编程。具体地说,Java中的方法必须在类中定义,没有独立存在的函数

也有人把结构化编程,叫做”面向函数的编程“,从而和”面向对象的编程“对应。

Java中的方法或属于某个对象(普通成员),或属于类(静态成员/类成员)。

Java中方法的执行也必须通过对象或类来调用。

在同一个类中,不同方法的调用其实是:

  • 默认使用this调用普通成员;
  • 默认通过类调用类成员。
方法的参数传递机制

和C++不同,Java中的参数传递只有一种:值传递

为什么Java没有引用传递呢?因为不需要。引用传递,意味着在函数体外,存在某个变量,将其地址传入函数体,实现节约拷贝开销的作用。但是在Java的方法之外,只有成员变量。成员变量可直接调用修改,并不需要拷贝。或者换个角度,Java的方法的形参里,不存在同类的成员变量,只能是临时变量,所以不存在使用引用传值的空间。

public class PrimitiveTransferTest
{
  public static void swap(int a, int b)
  {
    var temp = a;
    a = b;
    b = temp;
    System.out.println("swap方法里,a的值是"+a+";b的值是"+b);
  }
  public static void main(String[] args)
  {
    var a = 6;
    var b = 9;
    swap(a,b);
    System.out.println("交换结束后,变量a的值是"+a+";b的值是"+b);
  }
}

上述代码中,swap中的a和b分别是9,6;main中的a和b则是6和9。

为什么会这样?

其实很好理解:和C++中main只代表程序执行入口相比,Java中的main也是一个类方法!既然是类方法,那么就不存在引用传值,只有值传递!

在内存中,这些变量的情况是这样的:

在这里插入图片描述

经过swap后,内存中是这样的:

在这里插入图片描述

class DataWarp
{
  int a;
  int b;
}
public class ReferenceTransferTest
{
  public static void swap(DataWrap dw)
  {
    var tmp = dw.a;
    dw.a = dw.b;
    dw.a = tmp;
    System.out.println("swap方法里,a成员变量的值是"+dw.a+";b成员变量的值是"+dw.b);
  }
  public static void main(String[] args)
  {
    var dw = new DataWarp();
    dw.a = 6;
    dw.b = 9;
    swap(dw);
    System.out.println("main方法里,交换后a成员变量的值是"+dw.a+";b成员变量的值是"+dw.b)
  }
}

上述代码执行后,swap和main方法中a和b的值都被交换了。看起来似乎是引用传值啊!

然而

  1. main中创建了一个DataWrap对象,并且用tmp引用变量指向它,这时的内存如下图所示:

在这里插入图片描述

  1. 在main中调用swap方法,这时,新开辟了一块swap的栈内存。

此时,dw做为实参传入swap方法:由于dw实际上是引用变量类型(也就是指针),它保存的是指向堆内存中DataWrap对象的地址。因此,这里的值传递其实就是地址的传递,也就是说,swap(dw)中的dw接受了main中dw传来的地址。这时,swap方法的参数dw也就指向了同一个对象。

在这里插入图片描述

为进一步验证main中的dw和swap中的dw是两个变量,在swap方法的最后加一行:

dw = null;

如果这两个dw是同一个变量,那么这句话之后,main中的dw将不能再访问堆内存中的DataWarp对象了。然而main中的dw方法没有受到任何影响。此时内存相当于下图:

在这里插入图片描述

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

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

相关文章

Linux基础指令介绍与详解——原理学习

前言:本节内容标题虽然为指令,但是并不只是讲指令, 更多的是和指令相关的一些原理性的东西。 如果友友只想要查一查某个指令的用法, 很抱歉, 本节不是那种带有字典性质的文章。但是如果友友是想要来学习的,…

基于FPGA的DDS信号发生器

前言 此处仅为基于Vivado实现DDS信号发生器的仿真实现,Vivado的安装请看下面的文章,这里我只是安装了一个标准版本,只要能够仿真波形即可。 FPGA开发Vivado安装教程_vivado安装 csdn-CSDN博客 DDS原理 DDS技术是一种通过数字计算生成波形…

Linux shell编程学习笔记61: pstree 命令——显示进程树

0 前言 在 Linux shell编程学习笔记59: ps 获取系统进程信息,类似于Windows系统中的tasklist 命令https://blog.csdn.net/Purpleendurer/article/details/139696466?spm1001.2014.3001.5501 中我们研究了ps命令。在Linux中,通过ps命令&am…

William Yang:从区块链先锋到艺术平台创始人

在区块链技术和加密货币市场飞速发展的今天,William Yang无疑是这一领域的佼佼者。他不仅在学术和媒体领域取得了显著成就,更在创业之路上不断探索,成为了业内知名的KOL(关键意见领袖)。今天,我们有幸采访到…

排序算法系列一:选择排序、插入排序 与 希尔排序

目录 零、说在前面 一、理论部分 1.1:选择排序 1.1.1:算法解读: 1.1.2:时间复杂度 1.1.3:优缺点: 1.1.4:代码: 1.2:插入排序 1.2.1:算法解读&#x…

mysql-sql-第十五周

学习目标: sql 学习内容: 41.查询没有学全所有课程的同学的信息 select *from students where students.stunm not in (select score.stunm from score group by score.stunm having count(score.counm) (select count(counm) from course)) 42.查询…

【C++/STL深度剖析】stack和queue的详细概念和使用(图文详解,初学者必看!!)

目录 一、前言 二、stack 的详细解析 🔥 stack的介绍🔥 🔥 stack的构造🔥 🔥 stack的常用接口🔥 💧push 💧top 💧pop 💧empty 💧size…

违规停放智能监测摄像机

对于现代城市管理来说,违规停放智能监测摄像机正逐渐成为解决交通拥堵和城市管理难题的重要工具。这类摄像机通过先进的视觉识别和数据分析技术,有效监控和管理道路上的车辆停放行为,对提升城市交通运行效率和改善市民出行环境具有显著的意义…

pytorch-ResNet18简单复现

目录 1. ResNet block2. ResNet18网络结构3. 完整代码3.1 网络代码3.2 训练代码 1. ResNet block ResNet block有两个convolution和一个short cut层,如下图: 代码: class ResBlk(nn.Module):def __init__(self, ch_in, ch_out, stride):su…

锻炼 读书笔记 番外 身体激素及神经递质

最近在读《锻炼》的时候,对于各种激素很感兴趣,多巴胺、内啡肽、荷尔蒙、肾上腺素、褪黑素、皮质醇、糖化、氧化等等。索性认真梳理下它们是什么,思考当处于心流状态时,人体发生什么样的变化,分泌什么激素?…

Milvus ConnectionRefusedError: how to connect locally

题意:怎样在本地连接到 Milvus 数据库。连接 Milvus 数据库被拒绝的错误 问题背景: I am trying to run a RAG pipeline using haystack & Milvus. 我正在尝试使用 haystack 和 Milvus 运行一个 RAG(检索增强型生成)管道。 …

10 - Python文件编程和异常

文件和异常 在实际开发中,常常需要对程序中的数据进行持久化操作,而实现数据持久化最直接简单的方式就是将数据保存到文件中。说到“文件”这个词,可能需要先科普一下关于文件系统的知识,对于这个概念,维基百科上给出…

重温被Mamba带火的SSM:HiPPO的一些遗留问题

©PaperWeekly 原创 作者 | 苏剑林 单位 | 科学空间 研究方向 | NLP、神经网络 书接上文,在上一篇文章《重温被Mamba带火的SSM:线性系统和HiPPO矩阵》中,我们详细讨论了 HiPPO 逼近框架其 HiPPO 矩阵的推导,其原理是通过正交…

MySQL的Geometry数据处理之WKB方案

MySQL的Geometry数据处理之WKT方案:https://blog.csdn.net/qq_42402854/article/details/140134357 MySQL的Geometry数据处理之WKT方案中,介绍WTK方案的优点,也感受到它的繁琐和缺陷。比如: 需要借助 ST_GeomFromText和 ST_AsTex…

Gradio 教程四:Building Generative AI Applications with Gradio

文章目录 一、使用interface构建NLP应用1.1 构建文本摘要应用1.1.1 设置API密钥1.1.2 调用文本摘要API1.1.3 运行本地模型获取响应1.1.4 使用interface构建应用 1.2 构建命名实体识别应用1.2.1 调用NER任务API1.2.2 使用interface构建应用1.2.3 加入额外函数,合并to…

C语言实战 | 用户管理系统

近期推出的青少年防沉迷系统,采用统一运行模式和功能标准。在“青少年模式”下,未成年人的上网时段、时长、功能和浏览内容等方面都有明确的规范。防沉迷系统为青少年打开可控的网络空间。 01、综合案例 防沉迷系统的基础是需要一个用户管理系统管理用户…

Unity3d C#实现基于UGUI ScrollRect的轮播图效果功能(含源码)

前言 轮播功能是一种常见的页面组件,用于在页面中显示多张图片/素材并自动或手动进行切换,以提高页面的美观度和用户体验。主要的功能是:自动/手动切换;平滑的切换效果;导航指示器等。可惜Unity的UGUI系统里没有现成的实现该功能&#xff0c…

[Labview] 改写表格内容并储存覆盖Excel

在上一个功能的基础上,新增表格改写保存功能 [Labview] Excel读表 & 输出表单中选中的单元格内容https://blog.csdn.net/Katrina419/article/details/140120584 Excel修改前: 修改保存后,动态改写储存Excel,并重新写入新的表…

使用antd的<Form/>组件获取富文本编辑器输入的数据

前端开发中,嵌入富文本编辑器时,可以通过富文本编辑器自身的事件处理函数将数据传输给后端。有时候,场景稍微复杂点,比如一个输入页面除了要保存富文本编辑器的内容到后端,可能还有一些其他输入组件获取到的数据也一并…

Go - 8.func 函数使用

目录 一.引言 二.func 定义 三.func 实践 1.多个返回值 2.命名返回值 3.可变参数 四.总结 一.引言 函数是编程语言中的基本构建块,用于将代码组织成可重用的逻辑单元。函数可以接受输入参数,执行特定的操作,并返回结果。在 Go 语言&a…