java方法参数

Posted 程序员大宝(coder-dabao)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java方法参数相关的知识,希望对你有一定的参考价值。

文章目录

1 Java 程序设计语言总是采用按值调用。

按值传递:表示方法接收的是调用者提供的值。
按引用调动:表示方法接收是调用者提供的变量地址。

Java 程序设计语言总是采用按值调用。 也就是说, 方法得到的是所有参数值的一个拷 贝, 特别是, 方法不能修改传递给它的任何参数变量的内容。

java方法参数有两种类型。
1:基础数据类型:int,boolean,double,byte,long,char,float,short。
2:引用数据类型:String,类,接口,数组。

2 基础数据类型参数传递

public class Person 

    public static void main(String[] args) 
        int i = 3;
        System.out.println(i);

        doubleData(i);

        System.out.println(i);
    

    public static void doubleData(int x)
        x = 2 * x;
    


输出

3
3

i属于main的栈帧中,x属于doubleData栈帧中。

参数过程:
1,x 被初始化为i值得一个拷贝(也就是3)
2,x 被乘以 2 后等于6。但是i任然是3。
3,doubleData方法结束后,x不再使用。

其它7种基础数据类型和int一样,都是拷贝了值,按照值传递。

2. 引用数据类型作为参数

2.1 数组

public class Person 

    public static void main(String[] args) 
        int[] a = new int[2];
        a[0] = 5;
        a[1] = 7;
        System.out.println(a[0] + "," + a[1]);
        change(a);
        System.out.println(a[0] + "," + a[1]);
    

    public static void change(int[] b)
        int tmp = b[0];
        b[0] = b[1];
        b[1] = tmp;
    

输出

5,7
7,5

过程:
1、a指向的引用地址是:0X00000S11。
2、函数调用传递的时候,b会拷贝a的引用地址,指向0X00000S11。
3、change函数调用完毕后,b地址释放。但是a指向的地址还存在。

2.2 对象

2.2.1 对象引用传递

public class Person 

    private int id;

    Person(int id)
        this.id = id;
    

    public void setId(int id)
        this.id = id;
    

    public int getId()
        return this.id;
    

    public static void change(Person person)
        person.setId(7);
    

    public static void main(String[] args) 
        Person cleverCode = new Person(5);
        System.out.println(cleverCode.getId());
        change(cleverCode);
        System.out.println(cleverCode.getId());
    

输出

5
7

过程:
1、cleverCode指向了堆区new Person()引用,引用地址为的0X00000S13。
2、change方法,参数传递的时候,person拷贝了cleverCode指向的堆引用地址。
3、当调用change方法的时候,里面setId(7)。实际上是调用了new Person().setId(7)。

2.2.2 重新赋值

public class Person 

    private int id;

    Person(int id)
        this.id = id;
    

    public void setId(int id)
        this.id = id;
    

    public int getId()
        return this.id;
    

    public static void change(Person person)
        Person tom = new Person(9);
        person = tom;
        person.setId(7);
    

    public static void main(String[] args) 
        Person cleverCode = new Person(5);
        System.out.println(cleverCode.getId());
        change(cleverCode);
        System.out.println(cleverCode.getId());
    

5
5

刚开始person确实拷贝了cleverCode的引用地址。指向了0X00000S13。

但是person = tom进行了重新赋值。person的引用和tom的地址一样了,变成了:0X00000S19。

调用:person.setId(7);实际上是改变的0X00000S19地址的New Person()对象的值。

接口和对象一样。

2.3 String

String 也是一个对象。

public class Person 
    
    public static void change(String b)
        //b = new String("wan");
        b = "wan";
    

    public static void main(String[] args) 
        String a = "zao";
        System.out.println(a);
        System.out.println(a);
    

输出

zao
zao

没有变化的原因是b的指向的地址发生了变化。

参考资料

《你真的理解Java的按引用传递吗?》:https://blog.csdn.net/cauchyweierstrass/article/details/49047217
《Java 基础之方法中的参数》:https://blog.csdn.net/qq_38182125/article/details/88094475
《JAVA中的栈和堆》:https://www.cnblogs.com/ibelieve618/p/6380328.html

技术交流

欢迎关注我的微信公众号:程序员大宝。一个乐于分享的程序员!

以上是关于java方法参数的主要内容,如果未能解决你的问题,请参考以下文章

JAVA-初步认识-第十章-匿名内部类-应用

Java中有些方法的函数名会出现划线,这划线代表着啥意思吗?

10 绑定方法与非绑定方法

java基础:java中的方法

get/post请求中文出现乱码解决

java参数传递