Java 方法参数传递

Java方法参数传递详解与实践 本文深入解析了Java中参数传递的机制,包括数组参数、final参数、可变参数方法的使用及其实现原理。通过具体的代码示例,展示了如何在方法调用中传递数组,如何利用final关键字防止参数被意外修改,以及如何声明和使用可变参数方法。文章还讨论了main方法的结构和程序参数的传递,为理解Java方法调用和参数传递提供了详尽的指导。 阅读详情

Java 方法参数传递

- 在编程语言中,方法对于参数的调用分为 按值调用(call by value) 和 按引用调用(call by reference).
- 按值调用(call by value):方法接收的是调用者提供的值.
- 按引用调用(call by reference):方法接收的是调用提供的变量地址.
- Java 程序设计语言总是采用 按值调用(call by value).
- 引用《Java 核心技术卷1》

在 Java 中方法参数的传递总是 按值调用(call by value) 的。也就是说方法得到的是所有参数值的一个拷贝,方法不能修改传递给它的任何参数变量的内容。然而有时候这与我们所看到的不太一样。

在 Java 中方法参数共有两种类型:

基本数据类型(数值、字符、布尔);
对象引用

基本数据类型

public class ParamTest {

    public static void main(String[] args){
        double num = 10.0;
        System.out.println("Before... --> num = "+num);
        quadruple(num);
        System.out.println("After... --> num = "+num);
        
        System.out.println("--------------********----------------------");
        
        double a = 20.0;
        double b = 15.0;
        System.out.println("Before... --> a = "+a+",b = "+b);
        swap(a,b);
        System.out.println("After... --> a = "+a+",b = "+b);
        
    }
    
    public static void quadruple(double num){
        num*=4;
        System.out.println("quadruple...--> num = "+num);
    }
    
    public static void swap(double a,double b){
        double c = a;
        a = b;
        b = c;
        System.out.println("swap...--> a = "+a+",b = "+b);
    }
}

上面代码中方法 quadruple()在方法内部将参数num放大了四倍,swap() 方法试图将两个变量的值进行调换。

Before... --> num = 10.0
quadruple...--> num = 40.0
After... --> num = 10.0
--------------********----------------------
Before... --> a = 20.0,b = 15.0
swap...--> a = 15.0,b = 20.0
After... --> a = 20.0,b = 15.0

从运行结果来看,变量num、a、b都没有发生改变。这是因为 基本数据类型传递过去的都是 值 的拷贝,所以方法内部无论怎么修改变量的值都不会对外部变量产生影响。

对象引用

package com.yun;

public class ObjParamTest {
    public static void main(String[] args) {
        Student stu = new Student("晓风","软件");
        
        System.out.println("Before... --> stu = "+stu);
        change(stu);
        System.out.println("After... --> stu = "+stu);
        
        System.out.println("--------------********----------------------");
        
        Student stu1 = new Student("春雨","电子");
        Student stu2 = new Student("夏雷","幼教");
        System.out.println("Before... --> stu1 = "+stu1+",stu2 = "+stu2);
        swap(stu1,stu2);
        System.out.println("After... --> stu1 = "+stu1+",stu2 = "+stu2);
    }
    
    public static void change(Student stu){
        stu.setName("秋风");
        stu.setMojar("汽修");
        System.out.println("change...--> stu = "+stu);
    }
    
    public static void swap(Student s1,Student s2){
        Student t = s1;
        s1 = s2;
        s2 = t;
        System.out.println("swap...--> s1 ="+s1+",s2 = "+s2);
    }
}
class Student {
    
    private String name;
    private String mojar;
    
    public Student(String name,String mojar){
        this.name = name;
        this.mojar = mojar;
    }
    /** Getter / Setter **/
    @Override
    public String toString(){
        return "Studnet["+
                    "name = "+name+
                    ",mojar = "+mojar+"]";
    }
}

上面代码中,change()方法对 stu 变量的信息进行了修改并输出,swap()方法依旧是将两个变量进行交换,如果依照 基本数据类型 一样,那么所有的对象引用将不会发生改变,然而事情并不是像我们想的那样:

Before... --> stu = Studnet[name = 晓风,mojar = 软件]
change...--> stu = Studnet[name = 秋风,mojar = 汽修]
After... --> stu = Studnet[name = 秋风,mojar = 汽修]
--------------********----------------------
Before... --> stu1 = Studnet[name = 春雨,mojar = 电子],stu2 = Studnet[name = 夏雷,mojar = 幼教]
swap...--> s1 =Studnet[name = 夏雷,mojar = 幼教],s2 = Studnet[name = 春雨,mojar = 电子]
After... --> stu1 = Studnet[name = 春雨,mojar = 电子],stu2 = Studnet[name = 夏雷,mojar = 幼教]

可以看到,change()方法竟然成功修改了变量stu。既然 Java 总是按值传递的,那为什么这里对象引用有成功被修改了呢?是不是说 Java 对象引用是按引用传递的呢?答案肯定是不可能的,因为可以看到swap()方法依旧没能调换两个变量的值。

change()方法为什么能够改变对象引用的状态呢,这是因为 Java 中对象引用传递的是 地址值,当两个变量同时只向同一个 地址时,也就是说两个对象引用在操作一个对象。我认为它就像将一个对象变量赋值给另一个对象变量:

Student shily = new Student("Shily","Java");
Student stu = shily;

这里stu的状态发生改变,shily的状态跟着改变,这就相当于change()方法。swap()方法就像:

Student shily = new Student("Shily","Java");
Student stu = shily;
Student darn = new Student("Darn","C++");
stu = darn;

此时 变量stu又重新指向了darn的地址,然而这并不会对变量shily产生任何影响。

在对象引用中,还有一个特殊的对象 String

String

public class ObjParamTest {
    public static void main(String[] args) {
        String str = "original";
        System.out.println("Before... --> str = "+str);
        change(str);
        System.out.println("After... --> str = "+str);
    }
    public static void change(String str){
        str = "change...";
        System.out.println("change...--> str = "+str);
    }
}
Before... --> str = original
change...--> str = change...
After... --> str = original

String 类并没有发生改变,String类像基本类型一样。

总结:

  • 一个方法不能修改一个基本数据类型的参数
  • 一个方法可以改变一个对象参数的状态
  • 一个方法不能让对象参数引用一个新的对象
HyperLedger Fabric实战(一):基础环境构建 简介 本文将介绍从一台裸机上面如何构建出一个可用的Fabric网络(单机版,非测试网络)。 基础环境构建 Fabric组件安装 阅读详情

相关推荐

【hadoop编译报错】(yarn install) on project hadoop-yarn-applications-catalog-webapp Failed to run task

ambari+bigtop自定义组件集成

TTBIGDATA的博客 1804

java中将方法当作参数传递的方式

1. 使用consumer接口 在Java8中引入了一个函数式接口Consumer的对象,该对象可以把方法作为参数进行传递。 接口定义: @FunctionalInterface public interface Consumer<T> { void accept(T t); default Consumer<T> andThen(Consumer<? super T> after) { Objects.requireNo

不见其长,日有所长 2万+

注册“Oracle Provider for OLE DB”和创建链接服务器

注册“Oracle Provider for OLE DB”和创建链接服务器 在sql server 数据库上创建链接服务器,连接oracle数据库,访问接口需要设置为:“Oracle Provider for OLE DB”。 如果电脑上没有这个驱动,安装一个完整的Oracle11gR2程序是一个有效的方法,但这个64位版本的安装包有2个多G, 相当庞大,如果仅仅...

weixin_30760895的博客 2384

java 的参数传递

经过change方法执行后,实参的值被改变了,那按照上面2.2的引用传递的定义,实际参数的值被改变了,这不就是引用传递了么。那根据上面的两段代码,可以得出新的结论:Java的方法中,在传递普通类型的时候是值传递,在传递对象类型的时候是引用传递,真的是这样吗?看到这里,同学对 1,2,4 的结果肯定是不会有疑问,可能会有一部分同学会对 3 的输出有些疑问,change方法不是对序列进行了倒排,为啥3 处mockList 的序列没变,如果有这个疑问的同学,那么你有必要要认真看下本文;

小小码农 4982

Fluent实战——残差震荡分析与收敛优化策略

本文深入探讨了Fluent仿真中残差震荡的成因与优化策略。残差震荡是流场物理或数值问题的关键信号,文章系统分析了网格质量、边界条件、物理模型非定常性及求解设置四大主因,并提供了库朗数与松弛因子的调参心法,以及针对超音速流、共轭传热等典型场景的实战优化方案,旨在帮助用户有效提升计算收敛性与结果可靠性。

w1x2y3的博客 313

DEMATEL-ISM模型的Python实现——方法介绍以及代码复现

本文参考文献与网络资料,对DEMATEL-ISM方法做了介绍何步骤描述,并给出Python代码进行了计算和绘图。

cros1的博客 2万+

【java】方法的参数传递

方法:必须有其所在类或对象调用才有意义。 若方法含有参数: 形参:方法声明时的参数 实参:方法调用时实际传给形参的参数值 Java里方法的参数传递方式只有一种:值传递。 基本数据类型,值是保存在栈中; 引用对象,值保存在堆中,栈中存的是对象在堆中的地址。 方法参数传递之基本数据类型 public class Main { public static void main(String args[]) { int a = 0; swap(a); System.out.

qq_45746744的博客 4988

数学建模更新10(蒙特卡罗模拟)

蒙特卡罗模拟一.目录二.引例1:布丰投针实验1.投针步骤2.思路3. 历史实验者二.蒙特卡罗模拟概述1.定义2.提出3.原理4.讨论三.应用实例1.三门问题【1】问题【2】代码2.模拟排队问题【1】题目【2】引入参数【3】总结题目信息【4】过程可视化【5】一些推导公式【6】代码3.有约束的非线性规划问题【1】问题的分类【2】例子【3】推导过程【4】代码 一.目录 二.引例1:布丰投针实验 1.投针步骤 步骤: 1:取一张白纸,在上面画出许多条间距为a的平行线 2:去一根长度为l的针,随机的向纸张上投掷n次

沉晨尘宸的博客 3043

Java | javac中常见参数

暴力简单直接如图:

俗人 5072

Windows下OpenMBEE项目MMS部署失败经历及改正

在Github里找到了上面的第一份文档,下载了MMS源代码(不知道为什么这个代码跟上面操作克隆得到的MMS代码不一样?好像是因为Gradle的版本问题,我本地之前已经安装过7.6.4的Gradle了,于是我找到gradle-wrapper.properties文件。后面在VScode中运行了一下依然是报这个错误,我在VScode终端直接执行。不知道为什么依然没什么用。打开“Windows PowerShell”。(如果是第一次运行它,将看到更长的输出)导航到要克隆存储库的文件夹,例如,

Yo_lan_da的博客 1869

数仓建模—数据语义层

如今,企业产生大量数据,需要以正确的方式进行分析才能做出重要决策。数据可能来自多个来源并采用不同的格式,这使得清楚地了解其含义和重要性成为一项挑战。这就是语义层的用武之地。语义层存在于数据仓库和最终用户使用的应用程序之间。它为用户提供了简化且一致的数据视图,无论其基础数据源的复杂性如何。该逻辑层有助于映射物理数据结构以创建概念数据模型。它定义了数据元素之间的所有规则和关系,并以业务术语提供了数据的通用词汇表。然后,用户可以轻松地与数据进行交互,而无需了解其数据源的技术知识。

7万+

如何在Java中将方法作为参数传递

在Java中,我们可以使用函数式编程的概念,特别是lambda表达式、方法引用和函数式接口,将方法作为参数传递给另一个方法。这种技术可以让我们编写更加简洁和灵活的代码。

訾博(ZiBo)的博客 1504

PyTorch实战(26)——PyTorch分布式训练

在本节中,我们将探讨如何通过跨机器和机器内多进程的分布式训练来加速模型训练过程。我们将系统学习 PyTorch 提供的三大分布式训练 API——torch.distributed、torch.multiprocessing 以及 torch.utils.data.distributed.DistributedSampler,使用这些 API 能够极大的简化分布式训练,介绍如何使用 PyTorch 的分布式训练工具,在 CPU 和 GPU 上加速训练。

盼小辉丶的博客 3840

9. Java 方法与参数传递

Java 中的方法是执行特定任务的代码块,用于提高代码的复用性和模块化。方法的声明包括访问修饰符、返回类型、方法名、参数列表和方法体。方法可以分为静态方法和非静态方法,静态方法属于类本身,可直接通过类名调用,而非静态方法属于类的实例,需通过对象调用。访问修饰符(如 public、protected、private)控制方法的可见性。方法的使用场景包括代码复用、模块化和参数化行为。常见误区包括忽略返回值、混淆参数传递和未初始化局部变量。合理使用方法和访问修饰符有助于提高代码的安全性和可维护性。

weixin_43484713的博客 1208

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java方法的调用以及参数传递

周记(9/28-9/) 一.方法的调用及参数的传递 1.方法的调用 1.1 定义方法的语法 [访问修饰符] 返回值类型 方法名([参数类型 参数1,参数类型 参数2,…]){ ​ 方法体 } 详解: 访问修饰符:用于修饰这个方法的调用范围,目前默认public static 返回值类型:无返回值就写void或者方法执行后返回的结果的数据类型,方法执行之后会将结果返回 方法名:给方法取的名字,遵循标识符规则 参数类型,参数名:同时定义,方法在执行时未知的数据,需要在调用

weixin_47598133的博客 6014

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Java方法的参数传递

Java中方法的参数传递只有一种方式:值传递 将实际参数值的副本(复制品)传入方法中,而参数本身不受影响。所谓形参就是方法声明定义的时候的参数,实参就是方法调用时实际传递给形参的参数。介绍之前先简单了解下Java内存模型 那对于常见的一个学习的类就是Person,关于以下初始化如何实现的呢? //对象声明 Person p = new Person(); //变量定义 int i = 1; 栈中存放的对象的地址,真正的对象存在堆中,这就是引用对象 1.基本数据类型方法参数传递 接着.

止语的博客 2782

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Java 中的方法参数传递与值传递

在 Java 编程中,理解方法参数传递的机制是非常重要的。本文将通过一个简单的代码示例,深入探讨 Java 中的值传递(Pass by Value)机制,并分析为什么在某些情况下,方法内部的修改不会影响外部的变量。

李长渊的博客 789

java基础—方法的参数传递机制

java基础—方法的参数传递机制 1、基本类型参数传递   Java里方法的参数传递方式只有一种:值传递。所谓值传递,就是将实际参数值的副本(复制品)传入方法内,而参数本身不会受到任何影响。   Java里的参数传递类似于《西游记》里的孙悟空,孙悟空复制了一个假孙悟空,这个假孙悟空具有和孙悟空相同的能力,可除妖 或被砍头。但不管这个假孙悟空遇到什么事,真孙悟空不会受到任何影响。与此类似,传入方法的是实际参数值的复制品,不管方法 中对这个复制品如何操作,实际参数值本身不会受到任何影响。下面程序演示了方法参数传

qq_43265448的博客 644

java方法参数传递问题

本文属本人原创,如要转载,请指明出处(http://blog.youkuaiyun.com/rypgood),本人保留法律权力。java方法参数问题是一个热门话题,在各类考试如scjp,国家等级考试,各种笔试题等都是必考内容。在网上也有很多讨论这个问题的文章和视频,但是笔者都觉得说的不好,把简单的问题无限复杂化了。他们总在传值还是传地址的问题上或者基本类型与引用类型的问题上纠缠不清。笔者不才,也说

隐田龙 的专栏 2077

java方法的参数传递机制

方法的参数传递机制1.方法的参数传递机制2.实战3.方法的参数传递分析过程 1.方法的参数传递机制 实参是基本数据类型 传递数据值 实参是引用数据类型 传递地址值 特殊的类型:String、包装类等对象不可变性 2.实战 package com.jun; public class MyData { private int a = 10; public int g...

jiegouyihao的专栏 180

Java中方法调用时参数传递问题

下面通过一段代码理解Java中方法调用时参数传递问题 public class Demo01{ public static void mian(String[] args){ int i=10; add(i); system.out.println(i); } public static void add(i){ i++; system.out.println(i); } } 分析 此段代码...

Dream.... 546

java方法的参数传递其一

java方法的参数传递其一                                                                                                基本类型              java方法的参数传递有时不太好理解,结合简单的图形来对此问题进行一些分析。主要是参照张孝祥所著。 本文先看看基本类型的参数传递。 以下

nmyangym的专栏 1474

Java方法的参数传递机制

Java方法的参数传递机制 java中方法的参数传递方式只有一种:值传递。就是将实际参数的副本(复制品)传入方法中,其本身不会受到影响。 1、普通变量的传递 public class t { public static void swap(int a,int b) { int temp=a; a=b; b=temp; System.out.println("swap()方法中a的值为:"+a+",b值为:"+b); } public static void main(String[]

weixin_42556307的博客 249

Java中方法的参数传递

Java中方法的参数传递一、示例1、构建Person类2、编写demo测试类二、分析1、执行结果   在Java中,所有的参数传递方式都是值传递。下面通过例子来简单的说明一下。 一、示例 1、构建Person类 public class Person { private String name; private Integer age; public String getName() { return name; } public void set

qq_45603855的博客 509

Java方法参数传递机制

Java里方法的参数传递只有一种:值传递。就是将实际参数值的副本(复制品)传入方法内,而参数本身不会受到任何影响。 1、基本类型参数传递 public class valueTransmit { public static void main(String[] args) { int a = 6; int b = 9; Sys...

h1458280799的博客 310

java方法参数传递方式

问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?    答:是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的。   Java参数,不管是原始类

小人物 598
上一篇: 2020-09-15
下一篇: Spring Security -- 自定义登录
云与月与山
博客等级 码龄6年 1粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值