`

java中的传值与传引用

    博客分类:
  • java
 
阅读更多

java函数中的传值和传引用问题一直是个比较“邪门”的问题,其实java函数中的参数都是传递值的,所不同的是对于基本数据类型传递的是参数的一份拷贝,对于类类型传递的是该类参数的引用的拷贝,当在函数体中修改参数值时,无论是基本类型的参数还是引用类型的参数,修改的只是该参数的拷贝,不影响函数实参的值,如果修改的是引用类型的成员值,则该实参引用的成员值是可以改变的,例子如下。

 
首先是定义改变参数的
 
 
public static void changeInt(int i) {// 改变int型变量的函数
        i = 100;
    }

    public static void changeString(String s) {// 改变String型变量的函数
        s = "changeString";
    }

    public static void changeModel(Model model) {// 改变Model型变量的函数
        model = new Model();
        model.i = 1;
        model.s = "changeModel";
    }

    public static void changeModel2(Model model) {// 改变Model型变量的成员的函数
        model.i = 1;
        model.s = "changeModel";
    }

    // 类Model

    class Model {
        public int i = 0;
        public String s = "no value";
    }

    // 测试程序
    public static void main(String[] args) {
        int i = 0;
        String s = "hello";
        Model model = new Model();
        Model model2 = new Model();

        changeInt(i);
        System.out.println("i=" + i);
        changeString(s);
        System.out.println("s=" + s);
        changeModel(model);
        System.out.println("model:" + model.s);
        changeModel2(model2);
        System.out.println("model2:" + model2.s);

    }
 测试结果:
   i=0
   s=hello
   model:no value
   model2:changeModel
可以看出i没有改变,s也没有改变,mode也没有改变,model2的s改变了。
 
总结:java中的形参是复制实参的一份拷贝(对于引用型则是复制引用的拷贝)(在栈中的拷贝),所以在函数中改变形参是无法改变实参的值的,改变引用只是将形参所代表的引用指向另外的新的对象,而实参的引用还指向原来的对象,改变形参引用的成员当然会影响实参引用成员的值,因为他们的引用都指向同一个对象。
 
注意Atomic的使用
public class HelloWorld{
    public static void f1(AtomicInteger a, AtomicInteger b){
        int t;
        t=a.get();
        a.set(b.get());
        b.set(t);
    }
    public static void main(String[] args) {
        AtomicInteger a=new AtomicInteger (1);
        AtomicInteger b=new AtomicInteger (2);
        System.out.println(a.get()+" "+b.get());
        f1(a,b);
        System.out.println(a.get()+" "+b.get());
    }
}
 运行结果:
1,2

2,1
 像C++引用传递那样 能够修改形参的值 实现两个数的交换。其实就相当于又包了一层,传参还是 引用拷贝传参,修改值要用到get/set
 
原文地址:http://blog.sina.com.cn/s/blog_5198c7370100dut4.html

 

分享到:
评论

相关推荐

    java中传值与传引用

    在Java编程语言中,函数调用时的参数传递方式有两种:传值(Passing by Value)和传引用(Passing by Reference)。虽然Java官方文档中并未明确指出有传引用这一概念,但在实际操作中,Java的行为类似于传引用,尤其...

    JAVA中传值与引用问题

    本文将深入探讨Java中的传值与传引用问题,并通过具体的例子来解析其中的原理。 #### 二、基础知识回顾 在Java中,所有的数据类型可以分为两大类:基本类型(如int, double等)和引用类型(如Object, String等)。...

    java中传值还是传引用的的认识

    "java中传值还是传引用的认识" Java 中的参数传递是值传递还是引用传递?这是一个经常引发讨论的问题。在 Java 中,参数传递是按值传递的,也就是说,传递给方法的参数是一个副本,而不是原始值本身。 当一个对象...

    JAVA传值与传引用[整理].pdf

    JAVA传值与传引用[整理].pdf

    Java是传值还是传址引用

    ### Java是传值还是传址引用 #### 一、简单类型是按值传递的 Java在处理简单数据类型(如int、boolean等)时采用的是按值传递的方式。这意味着当你将一个简单类型的值作为参数传递给一个方法时,实际上传递的是这...

    java的传值与传值后的改变

    理解Java中的传值与传引用对于编写正确且预期的行为代码至关重要。在编写函数时,应清楚地知道参数如何被传递,以及这将如何影响函数的可读性和行为。在实际编程中,合理运用这些知识能帮助避免许多常见的错误和困惑...

    Java中的传值与传引用实现过程解析

    "Java中的传值与传引用实现过程解析" Java中的传值与传引用是Java编程语言中的一种基础概念,它们是Java函数中参数传递的两种方式。 Java中的传值是指函数参数的值被复制到函数内部,在函数内部对参数的修改不会...

    引用类型传值方法

    引用类型包括类(classes)、接口(interfaces)、数组以及委托(delegates),它们在内存中的存储方式与值类型截然不同。对于引用类型,变量存储的是一个指向对象内存地址的引用,而非对象本身。因此,当我们将一个...

    java类

    本文将通过一个具体的例子来深入探讨Java中的传值与传引用的区别,并解释如何利用这一特性来更好地管理程序的状态。 #### 1. 传值与传引用的概念 在Java中,基本数据类型(如int、char等)的参数传递遵循“传值”...

    JSP中java代码与js之间的传值

    - **通过JSP表达式语言(EL)**:使用EL表达式,如 `${javaVariable}`,可以直接在JavaScript代码中引用JavaBean或作用域内的变量。 2. **JavaScript到Java的传值**: - **表单提交**:通过JavaScript修改表单字段的...

    java及C++中传值传递、引用传递和指针方式的理解.docx

    ### Java及C++中传值传递、引用传递和指针方式的理解 在程序设计语言中,函数调用时参数的传递方式对理解程序的行为至关重要。本文将深入探讨Java与C++这两种广泛使用的编程语言中参数传递的方式,包括值传递、引用...

    浅析Java方法传值和传引用问题

    在Java编程语言中,方法参数传递机制涉及到两个主要概念:传值和传引用。了解这两个概念对于编写高效、可靠的代码至关重要。本篇文章将深入探讨Java中的方法传值和传引用问题。 首先,让我们理解什么是传值。在Java...

    Java传值还是引用

    根据标题和描述,我们将深入探讨Java中传值与引用的区别,以及它们在实际编程中的应用。 首先,Java是一种“总是按值传递”的语言。这意味着无论是基本类型还是引用类型,当作为参数传递时,都会有一个副本被创建并...

    23.Java对象作为参数传递是传值还是传引用1

    首先,我们需要理解Java中的引用概念。当创建一个对象,如`StringBuffer sb = new StringBuffer("Hello ");`,我们实际上是创建了一个新的对象,并为变量`sb`分配了一个内存地址,这个地址指向了新创建的对象。这个...

    分析java的传值问题

    本文将深入探讨Java中基本类型与引用类型的数据传递机制,并通过具体的示例代码来阐述这两者之间的区别。 #### 基本类型传值 Java中的基本数据类型包括`int`、`char`、`boolean`等。当我们将这些类型的变量作为...

    Java到底是传引用还是传值Java开发Java经验技巧共

    在Java中,基本数据类型(如int、float、char等)是按值传递的,而对象则是按引用传递的。但这并不意味着对象本身被复制,而是对象的引用被复制。 首先,我们来看基本类型的参数传递。当一个基本类型的变量作为参数...

    传值与传地址[文].pdf

    在编程语言中,传值与传地址是两种不同的参数传递方式。Java 作为一门面向对象的语言,对于简单类型和对象类型的处理方式有所不同。本文将详细解释这两种类型在Java中的传递机制。 1. 简单类型(按值传递) Java中...

    Java中引用类型传值的代码清单.pdf

    在Java编程语言中,引用类型变量实际上是对象的引用或指针,而非对象本身。当我们讨论“引用类型传值”时,意味着在方法调用时,传递的是对象引用的一个副本,而不是对象本身。以下是对给定代码清单的详细解释: 1....

Global site tag (gtag.js) - Google Analytics