zoukankan      html  css  js  c++  java
  • 函数传参传的是啥的思考【java Python】

    今天看《java 核心 卷1》的时候,作者提到了函数传参的问题,他提到,java传参,传的是值,而不是引用,然后,函数将要传的实参的值(如果实参是基本数据类型,那么就是值。如果实参是对象,则是内存地址)拷贝之后,赋予形参,然后,对形参进行操作。如果是8个基本类型,那么无论如何操作,都不会对原来的实参产生影响。如果要传的实参是对象,由于原来的实参和形参都是指向的同一个对象,所以,所有对形参的操作都将作用到原来的东西上,但是如果对形参进行了重新赋值,那么只是改变了形参的指向,那么将不会在对原来的实参产生影响。

        
    public class ArgDemo {
        public  static void improve(int x,int y){
            System.out.println(x);  //10
            System.out.println(y); //10
            x += 10;
            y += 20;
            System.out.println(x);  //20 这是在a b 的副本,x y上的操作。函数结束,就释放了
            System.out.println(y); //30
    
        }
        public static void main(String[] args){
               int a = 10 ;
               int b = 10 ;
               improve(a,b);
               System.out.println(a); //10  
               System.out.println(b);//10
        }
    }
    
    public class ArgDemo {
        public  static void change(String x,String y){
            System.out.println(x); //hello
            System.out.println(y); //world
            String temp = x;
            x = y;
            y = temp;
            System.out.println(x); //world//这里 x,y 的值已经发生了改变,如果穿的是参数(或者是如果传的是对象本身)的话,那么main函数里面的
            System.out.println(y); //hello  // 的x,y 也应该发生了改变。。事实是是没有变化的,这里操作的是a和b的副本。
    zhixiang
        }
        public static void main(String[] args){
            String a = "hello" ;
            String b = "world" ;
            change(a,b);
            System.out.println(a); //hello //这里和刚传进去的形参是一样的,且和原来一样,所以说,形参是 它们的副本。
            System.out.println(b); //world
        }
    
    }
    

    并给出了结论:
    1、一个方法不能修改一个基本数据类型的参数(数值型或布尔型)
    2、一个方法可以改变一个对象参数的状态(相当于在对象修改自身)
    3、一个方法不能让对象参数引用一个新的对象(相当于对参数也就是副本进行了重新赋值,这仅会影响参数的的指向,而不会影响实参的的指向)

    我想到了Python中的传参问题,Python中一切皆对象。

    a = [1,2,3]
    b = [1,2,5]
    
    print("bef a ================   "+str(id(a)))#140286697654752
    print("bef b ================   "+str(id(b)))#140286697655760
    def change(x,y):
        print("x ======== "+ str(id(x)))# 140286697654752
        print("y ======== "+ str(id(y)))#140286697655760
        temp = x #这里采用笨方式进行x,y的交换
        x = y
        y = temp
        print("x aft============= "+ str(id(x)))#140286697655760
        print("y aft============= "+ str(id(y)))#140286697654752
    
    
    change(a,b)
    
    print(a)#[1, 2, 3]
    print("bef a ================   "+str(id(a)))#140286697654752
    print("bef b ================   "+str(id(b)))#140286697655760
    print(b)#[1, 2, 5]
    
    ############################################################################
    
    
    a = "zmu"
    b = "muzdda"
    
    print("bef a ================   "+str(id(a)))#139816005403104
    print("bef b ================   "+str(id(b)))#139816005403152
    def change(x,y):
        print("x ======== "+ str(id(x)))# 139816005403104
        print("y ======== "+ str(id(y)))#139816005403152
        temp = x #
        x = y
        y = temp
        print("x aft============= "+ str(id(x)))#139816005403152
        print("y aft============= "+ str(id(y)))#139816005403104
    
    
    change(a,b)
    
    print(a)#zmu
    print("aft a ================   "+str(id(a)))#139816005403104
    print("aft b ================   "+str(id(b)))#139816005403152
    print(b)#muzdda
    
    
  • 相关阅读:
    [转]拓扑排序
    [转]C++ string学习
    二叉树的前序遍历
    My Solution to Lowest Common Ancestor of a Binary Tree Part I(TopDown Approach)
    求二叉树节点总数
    二叉树的中序遍历
    轻松搞定面试中的二叉树题目
    VS2005 CrystalReport开发Web应用
    ASP.NET 2.0移动开发入门之使用模拟器
    [原创]Ajax UpLoadFile 多个大文件上传控件,已更新。
  • 原文地址:https://www.cnblogs.com/jijizhazha/p/7718857.html
Copyright © 2011-2022 走看看