关于Java方法的参数

刚好看到C++的函数这块,说C++中除了引用类型的形参,其他都是实参的副本(个人总结)。

隐约记得Java中方法的参数也是这么回事,于是手动测试一番。

结果

Java中方法的参数都是值传递,哪怕是引用类型,传递的也是引用本身的副本(指向同一个对象)。

个人以为,将Java中的引用类型的变量看作指针更容易理解。

测试代码

import org.junit.Test;

public class TestFunction {

    @Test
    public void testInt(){
        int a = 3;
        int b = 4;
        swap(a, b);
        System.out.println(a + "---" + b);
    }

    @Test
    public void testString(){
        String a = "hehe";
        String b = "what";
        swap(a, b);
        System.out.println(a + "---" + b);
    }

    @Test
    public void testInner(){
        Inner a=new Inner();
        a.setAge(10);
        Inner b=new Inner();
        b.setAge(20);

        swap(a,b);
        System.out.println(a.getAge() + "---" + b.getAge());

    }

    /**
     * 基本类型,是值传递,所以不会修改原对象
     *
     * @param a
     * @param b
     */
    public void swap(int a, int b){
        a += b;
        b = a - b;
        a -= b;
    }

    /**
     * 字符串也是值传递
     * @param a
     * @param b
     */
    public void swap(String a, String b){
        String tmp = a;
        a = b;
        b = tmp;
    }

    /**
     * 引用,传递的也是引用本身,类似地址。所以只是副本,不会影响原值。
     * @param a
     * @param b
     */
    public void swap(Inner a, Inner b){
        Inner tmp=a;
        a=b;
        b=tmp;
    }

    /**
     * inner class
     */
    class Inner{
        private int age;
        public void setAge(int age){
            this.age=age;
        }
        public int getAge(){
            return this.age;
        }
    }
}

补充

绝大多数时候,我们使用的都是传入对象(引用类型)的成员,所以不会涉及这个问题。因为引用的副本仍然指向同一个对象。

时间: 2024-08-28 04:17:59

关于Java方法的参数的相关文章

Java方法输出参数

在写Java代码的时候,自定义方法的时候,都会牵扯到参数问题,方法参数包括输出参数和输入参数. 下面主要说说输出参数: 1.没有输出参数的时候就直接把输出参数写成void就可以. 2.当输出参数只有一个数据的时候,直接返回输出参数直接写成输出数据的类型就行. 3.当输出多个数据且类型一致的时候,使用数组,集合等等也可以实现. 4.当输出多个数据但是数据类型不一致的时候,此时就比较麻烦.此时需要将需要返回的数据类型封装到一个类中,然后返回的值写成新封装的类的名字即可. 例如: <span styl

Effective Java - 方法的参数声明

给方法的参数加上限制是很常见的,比如参数代表索引时不能为负数.对于某个关键对象引用不能为null,否则会进行一些处理,比如抛出相应的异常信息. 对于这些参数限制,方法的提供者必须在文档中注明,并且在方法开头时检查参数,并在失败时提供明确的信息,即: detect errors as soon as possible after they occur 这将成为准确定位错误的一大保障. 如果没有做到这一点,最好的情况是方法在处理过程中失败并抛出了莫名其妙的异常,错误的源头变得难以定位,但这是最好的情

java方法可变参数的写法

jdk1.5之后出现的,该写法避免了当有多个不同个数的参数方法时,对方法的重载. package com.shipin; /** * @author QiaoJiafei * @version 创建时间:2016年2月17日 下午4:19:08 * 类说明 */ public class TestParameter { public static void main(String[] args) { // TODO Auto-generated method stub int sum = tes

辨析Java方法参数中的值传递和引用传递

小方法大门道 小瓜瓜作为一个Java初学者,今天跟我说她想通过一个Java方法,将外部变量通过参数传递到方法中去,进行逻辑处理,方法执行完毕之后,再对修改过的变量进行判断处理,代码如下所示. public class MethodParamsPassValue { public static void doErrorHandle() { boolean a = false; int b = 5; passBaseValue(a, b); if (a == true || b == 10) { S

wrong number of arguments,java方法反射时数组参数的坑

java方法中只有一个参数是数组,反射的时候我们不能想当然的传歌数组进去,传数组进去的时候表示多个参数. 两个数组不是一个意思啊. 我们应该把数组转为objet,这样才表示一个参数. import java.lang.reflect.Method; public class MethodTest { public void a(String[] args) { System.out.println("a"); } public static void main(String[] arg

java 方法参数-值调用,引用调用问题

(博客内容来自于core java卷一) 1. xx调用:程序设计语言中方法参数的传递方式: 引用调用(call by reference):表示方法接收的是调用者提供的变量地址. 值调用(call by value):表示方法接收的是调用者提供的值. 命名调用(call by name):已经成为历史. 2. Java使用值调用,而且只有值调用.也就是说方法得到的是参数值的一个拷贝,并不是参数值本身,所以,方法不能修改传递给它的的任何参数变量本身. 看下面代码: public class te

Java基础---Java中带参数无返回值方法的使用(三十九)

Java 中带参无返回值方法的使用 有时方法的执行需要依赖于某些条件,换句话说,要想通过方法完成特定的功能,需要为其提供额外的信息才行.例如,现实生活中电饭锅可以实现"煮饭"的功能,但前提是我们必须提供食材,如果我们什么都不提供,那就真是的"巧妇难为无米之炊"了.我们可以通过在方法中加入参数列表接收外部传入的数据信息,参数可以是任意的基本类型数据或引用类型数据. 我们先来看一个带参数,但没有返回值的方法: 上面的代码定义了一个 show 方法,带有一个参数 name

巩固java(六)----java中可变参数方法(非常实用哦)

java提供了可变参数的方法,即方法的参数个数可以不确定,用"..."定义. import java.util.ArrayList; import java.util.List; public class VariableParameter { //求若干个整型数中的最大值 public int getMax(int... items){ //定义可变参数items int max = Integer.MIN_VALUE; //次数为int能表示的最小值,值为-2147483648 f

【求助】Java可变长参数方法调用问题

不说废话,直接上代码: 1 package mytest; 2 3 import java.util.List; 4 5 public class TestClass { 6 7 public void method(List<Object> list){ 8 System.out.println("method with param List<Object> invoked!"); 9 } 10 11 public void method(Object...