java类型作为参数传递的问题

  • 基本类型
  • 对象类型



在实际开发中,在抽取公共方法的时候,对于一些值传递并没有做深入的了解,导致碰到了问题,现在对于值传递进行总结。

基本类型

对于基本类型,在Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型,同时还包括我们经常使用到的BigDecimal类型:

在方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际传入参数的值,这个时候是值传递。

public static void main(String[] args) {
        Integer a = 0;
        String name = "name";   
        BigDecimal area = BigDecimal.ZERO;
        getmsg(name,a,area);
        System.out.println(a);
        System.out.println(name);
        System.out.println(area);
    }
    // 方法调用
      public static void getmsg(String name,Integer a, BigDecimal area){
        a = a+1;
        name = "name"+"name";
        area= BigDecimal.ONE;
    }

运行的结果如下:

java 参数代替所有类 java 类作为参数_System


从上面可以看出,对于原来的值并不会进行改变,只是简单的值传递。

对象类型

对象类型java中有包含了,实体列,数组,集合对象(Map,List)等。

方法调用时,参数传递的是对象的引用(地址),即在方法调用时,实际参数把对对象的引用(地址)传递给形式参数。这是实际参数与形式参数指向同一个地址,即同一个对象(数组),方法执行时,对形式参数的改变实际上就是对实际参数的改变,这个结果在调用结束后被保留了下来。

public static void main(String[] args) {
        HashMap<Object, Object> map = new HashMap<>();
        map.put("name","黄");
        map.put("sex","男");
        ArrayList arrayList = new ArrayList();
        arrayList.add("1");
        arrayList.add("2");
        getmsg2(ss,map,arrayList);

        System.out.println("数组的值:"+Arrays.toString(ss));
        System.out.println("map的值"+map.toString());
        System.out.println("list的值"+arrayList.toString());
    }
	// 调用方法
    public static void getmsg2(String[] ss,Map map,ArrayList list){
        map.put("addr","北京");
        ss[0]="55";
        list.add("3");
    }

运行结果:

java 参数代替所有类 java 类作为参数_值传递_02


从上面的运行结果可以看出,对于对象类型的传递是引用(地址)传递给形式参数,会 改变值

一种情况,如果在方法调用时如果重新创建一个对象赋值给传入进来的参数,这个赋值是无校的,仍然是原来的值,因为这个就赋值了一个新的地址,所以不会改变原来的值:

将上面的getmsg2调用方法进行更改,

public static void getmsg2(String[] ss,Map map,ArrayList list){
      HashMap<Object, Object> map1 = new HashMap<>();
      map1.put("addr","北京");
      map = map1;
  }

运行结果还是原来的值:

java 参数代替所有类 java 类作为参数_值传递_03


另一种情况,也是由对象的引用(地址),新创建一个对象,原来对象赋值给新的对象,这时修改新的对象的值,也会导致原来对象值的改变。

public static void main(String[] args) {

        HashMap<Object, Object> map = new HashMap<>();
        map.put("name","黄");
        map.put("sex","男");
        HashMap<Object, Object> map2 = new HashMap<>();
        map2= map;
        map2.put("name","宗");
        System.out.println(map);
    }

java 参数代替所有类 java 类作为参数_java_04

文章到此结束,欢迎大家在底下留言,如果有什么不对的问题,请多多指导!