Java中的值传递和引用传递

java中如何实现传入参数并修改参数本体的值

标题的意思是在java的方法中,传入一个参数并修改它,在方法体外的这个参数同时也会被修改,就相当于C语言里函数的参数列表是指针而不是普通的数据类型。java中没有指针,但是有类似指针的数据类型,就是引用类型。

引用类型

java中的引用类型有数组,对象和接口。

数组

对于下面这段代码,就实现了传入数组,经方法修改后方法体外的数组也被修改。

public class test{
    public static void main(String args[]){

        char []s = {'a','a','a'};

        System.out.print("修改前:");
        for(int i=0; i<s.length; i++){
            System.out.print(s[i]);
        }
        System.out.println();

        A.fun(s);
        
        System.out.print("修改后:");
        for(int i=0; i<s.length; i++){
            System.out.print(s[i]);
        }
        System.out.println();
    }
}

class A{
    static void fun(char []s){
        for(int i=0; i<s.length; i++){
            s[i]='b';
        }
    }
}

对象

其实我起初一直坚信没有指针后java想要修改传递的值会很不方便,还要专门创建对象,多麻烦。但事实证明我还是太年轻了。

我在这之前曾经有一个想法,int不是对应Integer类吗,char不是对应Character类吗?那么我为什么不可以通过这种基本数据类型的封装类来创建对象,这不就实现了基本数据类型的修改吗?想到这里我甚至觉得自己是个天才,但很快代码测试就打了我的脸。

public class test{
    public static void main(String args[]){

        Integer a = 666;

        System.out.println("修改前:a="+a);

        A.fun(a);
        
        System.out.print("修改后:a="+a);
    }
}

class A{
    static void fun(Integer a){
        a=999;
    }
}

看来这种“天才”的想法行不通。

大丈夫能屈能伸,咱换条路。

public class test{
    public static void main(String args[]){

        Number num = new Number();

        System.out.println("修改前:num="+num.integer+"."+num.fraction+ "长度为"+num.len);

        A.fun(num);
        
        System.out.println("修改后:num="+num.integer+"."+num.fraction+ "长度为"+num.len);
    }
}

class Number{
    int integer = 0;
    int fraction = 0;
    int len = 0;
}

class A{
    static void fun(Number num){
        num.integer = 123;
        num.fraction = 456;
        num.len = 6;
    }
}

我之前算是没有领会到java的对象思想,对象即意味着封装,数据不在是孤立的,而是共同属于一个对象,这样可以更方便的管理数据,同时也符合人类的思维模式。拿上面这段代码为例,创建一个Number类,Number类有integer、fraction和len三个成员变量,基本上满足了一个数的基本属性,以这个类创建的num对象传入到方法之后,便可通过成员运算符修改对象的成员变量,这样也挺方便的。

接口

接口比较特殊,接口可以简单理解成一种特殊的类(实际上并不是类)。我们知道类是由变量方法组成的,接口中的变量会被隐式的指定为 public static final 变量,而接口中的方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract,final变量实际上就是常量,而abstract方法也没有具体的方法体,所以说传入一个接口类型的变量是没什么好修改的,故这种引用类型的引用传递一般来说不考虑。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋窗7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值