zoukankan      html  css  js  c++  java
  • Java 为值传递而不是引用传递

    ——reference Java is Pass by Value and Not Pass by Reference

    其实这个问题是一个非常初级的问题,相关的概念初学者早已掌握,但是时间长了还是容易混淆,特此总结一下

    一、值传递和引用传递

      首先这里我们先看下两者的异同:

    • 值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值。
    • 引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。

    二、Java总是值传递而非引用传递

    举例:

    Balloon.java

     1 package com.journaldev.test;
     2  
     3 public class Balloon {
     4  
     5     private String color;
     6  
     7     public Balloon(){}
     8      
     9     public Balloon(String c){
    10         this.color=c;
    11     }
    12      
    13     public String getColor() {
    14         return color;
    15     }
    16  
    17     public void setColor(String color) {
    18         this.color = color;
    19     }
    20 }

    之后我们做一个简单测试,交换两个对象

    Test.java

     1 package com.journaldev.test;
     2  
     3 public class Test {
     4  
     5     public static void main(String[] args) {
     6  
     7         Balloon red = new Balloon("Red"); //memory reference 50
     8         Balloon blue = new Balloon("Blue"); //memory reference 100
     9          
    10         swap(red, blue);
    11         System.out.println("red color="+red.getColor());
    12         System.out.println("blue color="+blue.getColor());
    13          
    14         foo(blue);
    15         System.out.println("blue color="+blue.getColor());
    16          
    17     }
    18  
    19     private static void foo(Balloon balloon) { //baloon=100
    20         balloon.setColor("Red"); //baloon=100
    21         balloon = new Balloon("Green"); //baloon=200
    22         balloon.setColor("Blue"); //baloon = 200
    23     }
    24  
    25     //Generic swap method
    26     public static void swap(Object o1, Object o2){
    27         Object temp = o1;
    28         o1=o2;
    29         o2=temp;
    30     }
    31 }

    输出如下:

    1 red color=Red
    2 blue color=Blue
    3 blue color=Red

     从上面的代码可以得出:

    • 两个对象在被调函数中交换并不能影响主调函数中的两个对象
    • 但是在被调函数中对对象进行修改(对象的某一域),那么在主调函数中是可以反映出来的

    第一点我们就可以看出Java确实是值传递的,然而第二点又让我们出现疑惑,为何对象的修改会影响到主调函数

    这涉及到Java中的数据存储方式,堆栈存储在(Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)

    Java中除了基本类型(【Java心得总结一】Java基本类型和包装类型解析)外,其他类型声明都是在栈中保存一个指向堆中的引用,而对象的数据都是在堆中保存的,如图:

     

    所以在函数调用时,如果传递对象,Java确实是值传递,开辟一个新的存储空间存放形参,并将实参的值传递过来,但是两者指向同一处堆的存储空间,所以造成了上述交换无用,但是改变对象中的数据有用的结果

  • 相关阅读:
    Android笔记(五十七)Android总结:基础篇
    Android笔记(五十六) Android四大组件之一——ContentProvider,实现自己的ContentProvider
    Android笔记(五十五) Android四大组件之一——ContentProvider,使用系统提供的ContentProvider
    Python类定义
    Python 作用域和命名空间
    Python 默认参数值
    Python 关键字参数和可变参数
    Python常用函数--return 语句
    Python常用函数--文档字符串DocStrings
    如何编写 Python 程序
  • 原文地址:https://www.cnblogs.com/xlturing/p/4498910.html
Copyright © 2011-2022 走看看