`

传值还是引用

    博客分类:
  • Java
 
阅读更多
public class A
{
  public static void main(String args[]){
    Person p1 = new Person("zhangshan",28);
    Person p2 = new Person("lisi",27);
    A a = new A();
    a.changeObj(p1, p2);
    System.out.println(p1.name + "__" + p2.name);

    a.changeObj2(p1);
    System.out.println(p1.name);

    a.changeObj3(p2);
    System.out.println(p2.name);

    StringBuffer sb1 = new StringBuffer("s11111");
    StringBuffer sb2 = new StringBuffer("s22222");
    a.changeSB(sb1, sb2);
    System.out.println(sb1 + "__" + sb2);

    int x = 10;
    int y = 100;
    a.changeInt(x, y);
    System.out.println(x + "__" + y);  //传值,copy一份给形参

    String s1 = "s1";
    String s2 = "s2";
    a.changeString(s1, s2);
    System.out.println(s1 + "___" + s2);

  }

  public void changeObj(Person p1, Person p2){
    Person temp = new Person("",0);
    temp = p1;
    p1 = p2;
    p2 = temp;
  }

  public void changeObj2(Person p){
      p.setName("test"); //changed
  }

  public void changeObj3(Person p){
      p = new Person("test", 12); //no change ,p指向了一个新的new出来的对象,改变不会影响传进来的p2
  }

  public void changeSB(StringBuffer sb_1, StringBuffer sb_2){  //传递的是引用
      sb_1.append("+appended"); //sb_1和主方法中的sb1指向堆中的同一个对象
      sb_2 = sb_1;               //sb_2作为形参,重新指向了形参sb1,sb_2只是局部变量,并没有影响主方法的实参sb2
  }

  public void changeInt(int a, int b){
      int temp;
      temp = a;
      a = b;
      b = temp;
  }

  public void changeString(String s_1, String s_2){
      String temp;
      temp = s_1;
      s_1 = s_2;
      s_2 = temp;
  }
}


class Person
{
    public String name;
    public int age;

    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }

    public void setName(String name){
        this.name = name;
    }
}

 

 

大体上说:对于java的基本数据类型,都是值传递,也就是实参copy一份给形参,对于形参的任何改变不会影响实参

如果是对象(包括字符串对象),都是传递的地址,如果对实参做出了改变,那就是有效的.

局部变量和成员变量之类都是保存在内存的栈(stack)中,new出来的都是在堆中(heap),java中没有指针,都是这个其实就是指针.

ex:Peson p = new Person();

p位于栈中,new出来的Person对象在堆中,p记录的是一串类似 于堆中内存地址的东西,就是说可以通过p来访问Persopn对象

分享到:
评论

相关推荐

    Java传值还是引用

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

    赋值传值,引用传值,指针传值的区别

    构造函数,借助构造函数 解释 【赋值传值】,【引用传值】,【指针传值】

    Java是传值还是传址引用

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

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

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

    labview主VI和子VI的传值、全局变量传值、引用传值

    引用传值通过“创建引用”函数实现,子VI则使用“引用事件结构”来处理引用传来的消息。这种方式虽然强大,但也需要更高的编程技巧和理解,因为不当使用可能会导致内存泄漏或死锁等问题。 在实际应用中,通常会根据...

    JAVA中传值与引用问题

    ### JAVA中传值与引用问题详解 #### 一、引言 在计算机编程领域,特别是对于面向对象语言如Java而言,“传值”与“传引用”的概念是理解数据传递机制的关键所在。Java作为一种广泛使用的高级编程语言,在设计之初就...

    C++传值调用与引用调用区别实例代码

    ### C++中的传值调用与引用调用 在C++编程语言中,函数调用是一种常见的编程结构,用于执行特定任务或计算结果。当一个函数被调用时,可以通过不同的方式传递参数,其中最常见的是传值(call by value)和传引用(call...

    引用类型传值方法

    本篇文章将详细探讨引用类型的传值方式。 首先,理解引用类型的概念至关重要。引用类型包括类(classes)、接口(interfaces)、数组以及委托(delegates),它们在内存中的存储方式与值类型截然不同。对于引用类型...

    python基础入门教程:传参是传值还是传引用.pdf

    Python中的参数传递并非简单的"传值"或"传引用",而是一种特殊的机制,通常被称为"传对象引用"。这意味着,当你将一个变量作为参数传递给函数时,实际上是传递了这个变量所引用的对象的引用,而不是对象的副本。 ...

    java中传值与传引用

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

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

    许多人认为对象是按引用传递,而实际上,Java总是按值传递,包括对象。这里的“值”指的是对象的引用,而不是对象本身。这与C++或C#等其他语言中对象的传递方式有所不同。 首先,我们需要理解Java中的引用概念。当...

    传值调用与引用调用.cs

    传值调用与引用调用.cs

    java的传值与传值后的改变

    - 引用类型传值时,函数可以修改对象的内容,但不能改变对象的引用。 4. **局部变量与成员变量**: 函数内部的变量是局部变量,它们只在函数内部有效。而类的成员变量(包括实例变量和静态变量)在整个类的范围内...

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

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

    php引用传值实例详解学习

    PHP引用传值是一种将一个变量标识符与另一个变量标识符绑定在一起的方式,使得这两个标识符能够访问同一个变量的值。通过使用引用操作符(&),PHP允许开发者创建指向同一数据的变量别名,而不是创建变量的副本。...

    详解python函数传参是传值还是传引用

    首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题。基本的参数传递机制有两种:值传递和引用...

    vue prop属性传值与传引用示例

    vue组件在prop里根据type决定传值还是传引用。 简要如下: 传值:String、Number、Boolean 传引用:Array、Object 若想将数组或对象类型也以值形式传递怎么办呢?如下方式可以实现: // component-A 引用component-...

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

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

Global site tag (gtag.js) - Google Analytics