java传递引用参数

Java参数传递:值传递还是引用传递? Java中的参数传递方式是一个常见但容易混淆的概念。Java采用的是值传递,而不是引用传递。在值传递中,方法接收的是变量的副本,而不是原始变量本身。对于基本数据类型,方法内部的修改不会影响原始变量;对于对象引用,虽然传递的是引用的副本,但修改对象属性会影响原始对象,而重新赋值引用则不会影响原始引用。理解这一点对于正确编写Java代码至关重要。为避免混淆,可以使用包装类来实现类似引用传递的效果。 阅读详情

基本类型参数的传递,是值的复制

基本类型参数的传递,是值的复制。双方各在内存中保存一份,各自的后续修改,互不影响。

例如:

public class Main {
    public static void main(String[] args) {
        Person p = new Person();
        int n = 15; // n的值为15
        p.setAge(n); // 传入n的值
        System.out.println(p.getAge()); // 15
        n = 20; // n的值改为20
        System.out.println(p.getAge()); // 15还是20?
    }
}

class Person {
    private int age;

    public int getAge() {
        return this.age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

输出值是

15
15

所以外面的n从15变到了20,但是Person里面的age并没有改变。

数组类型参数的传递,是引用的复制

字符串数组在参数传递时,考虑到字符串数组占用内存空间非常大,所以传递的是一个引用,此时调用函数的变量,被调函数的变量,和被调函数内部的变量,都是指向内存中的同一个位置的。

任意一方的修改,都会指向这个引用区域的修改。

举例说明:

//注意这里的Main是基本类型,后面是不可以写括号的
public class Main{
    public static void main(String[] args){
        //新建一个类
        Person p = new Person();
        //初始化为字符串数组,需要使用new String[] {}来初始化
        String[] fullname = new String[] {"liu","kai"};
        //因为传入的是字符串数组,所以退化为引用,实际传入了引用
        p.setName(fullname);
        System.out.println(p.getName());
        //修改了字符串数组里面的内容
        fullname[0] = "chen";
        //输出值指向被改变的引用,输出也是引用,
        System.out.println(p.getName());

        //再看一个例子
        PPerson pp = new PPerson();
        //初始化为一个基本的字符串类型
        String shortname = "liukai";
        //传入的基本值
        pp.setName(shortname);
        System.out.println(pp.getName());
        shortname = "chenkai";
        //输出的也是基本值
        System.out.println(pp.getName());   //输出liukai
        System.out.println(shortname);      //输出chenkai
        }
}

class Person{
    //新建了一个字符串数组,特别注意引用
    private String[] name;
    public String getName(){
        return this.name[0] + " " + this.name[1];
    }
    //注意这里返回类型不是String,必须写成void,否则会报错
    public void setName(String[] name){
        this.name = name;
    }
}

class PPerson{
    //新建了一个字符串基本类型
    private String name;
    public String getName(){
        return this.name;
    }
    public void setName(String name){
        this.name  = name;
    }
}

输出的结果为

liu kai
chen kai
liukai
liukai
chenkai

Java 中的参数传递是按值还是按引用? Java 中,所有方法参数都是值传递。String的不可变性进一步确保了它的原始值不会被修改。理解String的不可变性和值传递的机制,有助于更好地编写和调试代码。类型传递方式方法内操作对原变量的影响基本数据类型值传递不会影响原变量不可变类引用值的副本传递不会影响原变量可变引用类型引用值的副本传递可能通过引用修改原变量指向对象的内部状态。 阅读详情

相关推荐

Java 参数传递到底是按 值传递 还是 引用传递 ?

首先明确,Java 中方法参数传递方式是按值传递。对于基本类型(int a, long b),参数传递时传递的是值,例如 int a = 5,传递的就是 5。如果是引用类型,传递是指向具体对象内存地址的地址值,例如用 System.out.println(new Object())打印出来的 java.lang.Object@7716f4 中 @符号后面的 7716f4 就是 16 进制的内存地址,System.out.println 实际上是默认调用了对象的 toString 方法,}...

weixin_70730532的博客 614

java中的参数传递(值传递和引用传递详解)

java中的参数传递只有值传递,对于基本数据类型传递的是值的副本,引用数据类型传递的是引用的副本。

Diligent的博客 2715

Java参数传递机制:值传递与引用传递的常见误解

本文详细解析了Java的参数传递机制,澄清了常见的误解。Java严格采用值传递,对基本类型传递值副本,对引用类型传递对象引用的副本。通过代码示例和内存模型分析,文章展示了基本类型修改不影响原值,而引用类型修改会影响原对象内容但不改变原始引用。文章还对比了不同语言的参数传递方式,分析了字符串和集合类等复杂场景,强调不可变对象的特殊行为。最终结论是:Java始终是值传递,理解这一机制对避免程序错误至关重要。

记录学习的过程 918

java实现引用参数传递

Java实现引用参数传递 作为一名刚入行的小白,你可能会对Java中的参数传递方式感到困惑。在Java中,参数传递主要有两种方式:值传递和引用传递。值传递是将参数的值复制给方法,而引用传递则是将参数的引用复制给方法。但是,Java中实际上只有值传递,没有真正的引用传递。不过,我们可以通过一些技巧来模拟引用传递的效果。 流程...

weixin_30883241的博客 360

循环神经网络(RNN)

在之前学习了全连接神经网络(DNN)模型,网络结构都是从输入层到隐含层再到输出层,层与层之间是全连接或部分连接的,但每层之间的节点是无连接的。 一、神经网络基础 神经网络可以当做是能够拟合任意函数的黑盒子,只要训练数据足够,给定特定的x,就能得到希望的y,结构图如下: 将神经网络模型训练好之后,在输入层给定一个x,通过网络之后就能够在输出层得到特定的y,那么既然有了这么强大的模型,为什么还需要RNN(循环神经网络)呢? 二、为什么需要RNN(循环神经网络) 考虑这样一个问题,如果要预测句子的下一个单词是什么

小朱小朱绝不认输的博客 2万+

RK3588开发板量产前必做:24小时DDR压力测试到底在测什么?(附ArmSoM-W3测试脚本解析)

本文深入解析RK3588开发板量产前的24小时DDR压力测试,揭示其核心价值与技术原理。通过memtester、stressapptest和变频测试的组合使用,全面验证DDR内存稳定性。特别介绍ArmSoM-W3测试脚本的创新设计,包括并行测试架构和异常熔断机制,为开发者提供可靠的量产测试方案。

weixin_30325487的博客 454

Java 中引用类型的参数传递

当引用类型作为参数传递给方法时,方法接收的是引用的副本,指向同一个对象。在方法内部修改对象的属性,会影响到方法外部的对象。在方法内部重新赋值引用,不会影响方法外部的引用。理解 Java 中引用类型的参数传递机制,有助于编写更加高效和健壮的代码。记住,虽然 Java 是按值传递,但对于引用类型,这个值是引用本身。掌握这一点,可以帮助大家更好地理解代码的行为,避免常见的陷阱。

muxiuyulin871的博客 819

知识导航神器:Obsidian Breadcrumbs 插件全攻略

Parent: 插件Child: Breadcrumbs 用法这样,它就能识别出你和其他笔记的关系。

m0_73735578的博客 1630

Java基础——参数传参(基本类型,引用类型传参)

java中基本数据类型和引用数据类型作为参数传递时的原理和过程,并解释了值传递与引用传递在Java中的区别,并涉及部分java的内存模型

yexiann的博客 8883

长安车机破解后能干啥?分享我的UNI-K车机安装第三方应用与优化体验实录

本文详细记录了长安UNI-K车机破解后的实用玩法与深度优化指南,包括安装第三方应用、导航体验升级、影音系统改造及系统美化等。通过工具箱和升级技巧,车主可以大幅提升用车体验,解锁更多隐藏功能。

weixin_33217202的博客 404

【置顶】TEE从入门到精通-[目录]

此专栏讲解包含不限于optee、商用TEE、常规的安全业务设计。但主要基于optee最新代码,深度讲解和剖析各项原理和机制...

baron-周贺贺-代码改变世界ctw 6426

Java中的参数传递

很多程序设计语言(比如 C++、 Pascal )提供了两种参数传递的方式,不过,在 Java 中只有值传递。那我们常听的Java中的引用传递是什么?传递的是一个拷贝,即副本。也就是说,对于一个参数传递,存在两个地址指向同一个内存空间。

m0_74267125的博客 2674

大数据领域数据服务的数据分析工具推荐

你有没有过这样的经历?——领导说“帮我分析一下上个月的销量”,你打开Excel却发现数据有100万行,电脑直接卡死;或者想实时知道“现在直播间的观众在买什么”,却不知道用什么工具处理每秒10万条的点击数据。本文的目的:帮你解决“选什么工具做什么事”的问题,覆盖大数据服务的全流程(采集→存储→处理→分析→可视化),推荐高频、实用、易上手的工具,并讲清楚它们的“适用场景”和“优缺点”。范围。

大数据洞察的博客 1931

Java中的参数传递,到底是值传递还是引用传递?(*)

参数传递

weixin_42408447的博客 5090

3 路由引入

在大型企业网络中,网络规模十分庞大,选用单一的路由协议无法满足网络的需求,因此多种路由协议共存的情况十分常见。或者出于业务逻辑或行政管理的考虑,会在不同的网络结构中设计和部署不同的路由协议,使路由的层次结构更加清晰可控。路由引入是具有方向性的,将路由信息从路由协议A引入到路由协议B(A-to-B),则路由协议B可获知A中的路由信息,但是此时,A还并不知晓B路由协议中的路由信息,除非配置B-to-A的路由引入。表3-1:各种路由协议的优先级。通过路由引入,可以实现路由信息在不同路由协议间传递。

lwljh134的博客 621

点云目标检测:open3d多窗口联动可视化

多个模型之间的对比除了指标之外,还需要可以直接直观的对比可视化结果,这次介绍一下如何使用open3d同时打开两个窗口分别加载两个模型的结果进行对比,同时实现两个窗口的联动,也就是当一个窗口拖动或者缩放时另外一个窗口也跟着做同样的变换。

zhaoguanhua的博客 4688

Java中的参数传递,到底是值传递还是引用传递?

Java中的参数传递,到底是值传递还是引用传递? 错误理解一:值传递和引用传递,区分的条件是传递的内容,如果是个值,就是值传递。如果是个引用,就是引用传递。 错误理解二:Java是引用传递。 错误理解三:传递的参数如果是普通类型,那就是值传递,如果是对象,那就是引用传递。

iqqcode 1万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

java 函数参数引用传递_JAVA中方法参数的引用传递

Java中方法参数的引用传递java中参数的传递有两种,分别是按值传递和按引用传递。按值传递不必多说,下面就说一下按引用传递。当一个对象被当作参数传递到一个方法,这就是所谓的按引用传递。public Class User{private String name;public String getName() {return name;}public void setName(String nam...

weixin_31994237的博客 1143

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java的参数传递是值传递还是引用传递

Java的参数传递是值传递还是引用传递 关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题。有人说Java中只有值传递,也有人说值传递和引用传递都是存在的,比较容易让人产生疑问。关于值传递和引用传递其实需要分情况看待。 一、Java数据类型 Java数据类型分为「基本数据类型」和「引用类型」两大类。 基本数据类型(8种) 引用类型(3种) 引用类型可分为类引用类型(类)、接口引用类型(接口)和数组引用类型(数组)。以下代码定义了3个引用变量:user、myThread、in

蓝带的博客 811

OV9734 DATASHEET,完整规格书

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

Java中函数参数传递是【值传递】还是【引用传递】?

引用变量,是存在栈中的,其指向的对象,是存在堆中的,引用变量的值其实就是指向的对象在堆中的具体的地址。指针传递(pass by pointer),即将实参的地址传递给形参,后续操作形参,就是直接操作内存空间,进而也会影响实参。函数调用的时候,根据实参和形参之间的关系、如何影响等,可以将参数的传递方式分为值传递、指针传递、引用传递【不同编程语言规定有不同传递方式】。在Java中,方法参数的传递方式总是按值传递,这意味着不管一个变量是基本数据类型还是引用数据类型,传递的都是变量的一个副本。,而不是变量的副本。

massive_jiang的博客 1537

Java的参数传递到底是引用传递还是值传递

首先看一段代码:public static void main(String[] args) { Person a = new Person(23, "a"); Person b = new Person(22,"b"); System.out.println("改变前a:"+a+"\nb:"+b); changeValue(a,b); System.out.

忙里偷闲得几回的专栏 5085

java方法参数传递方式--按值传递、引用传递

java的方法参数传递方式有两种,按值传递和引用传递 1.按值传递

zhenge1990的博客 3万+

Java参数是值传递还是引用传递

1、概述        对于初学者来说,要想把这个问题回答正确,是比较难的。在第二天整理答案的时候,我发现我竟然无法通过简单的语言把这个事情描述的很容易理解,遗憾的是,我也没有在网上找到哪篇文章可以把这个事情讲解的通俗易懂。所以,就有了我写这篇文章的初衷。这篇文章中,我从什么是方法的实际参数和形式参数开始,给你讲解为什么说Jav...

qq_39771044的博客 242

Java方法的参数是按值传递还是按引用传递?

当一个对象被当作参数传递到一个方法后,在此方法内可以改变这个对象的属性,那么这里到底是「按值传递」还是「按引用传递」?   答:是按值传递。Java 语言的参数传递只有「按值传递」。当一个实例对象作为参数被传递到方法中时,参数的值就是该对象的引用的一个副本。指向同一个对象,对象的内容可以在被调用的方法内改变,但对象的引用(不是引用的副本) 是永远不会改变的。 Java 的参数传递,不管是基本数...

通往神秘的道路的专栏 591
上一篇: Harris角点检测和Shi-Tomasi角点检测
下一篇: Win10如何删除3D对象文件夹
刘凯KAI
博客等级 码龄15年 663粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值