java学习笔记:java的方法参数传递

Posted 滴滴哒滴哒

tags:

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

         方法(也称函数)调用是程序设计语言一种最基本的功能。一个完整的方法声明一般包括了返回值、方法名称、方法参数三个基本要素。

         方法参数的传递主要分为两种:按值调用按引用调用

       按值调用:表示方法接收的是调用者提供的

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

       java的传值采用了按值调用

public class ValueTest 

    public static void changeCircle(Pointer center, int radius, Integer diameter, String shape) 
        center.setLocation(10, 10);
        radius = 100;
        diameter = 200;
        shape = "circle";
        System.out.println("In changeCircle center is:" + center +
                ";radius is:" + radius +
                ";diameter is:" + diameter +
                ";shape is:" + shape);
    

    public static void main(String[] args) 
        Pointer pt = new Pointer();
        pt.setLocation(0, 0);
        int r = 5;
        Integer R = 10;
        String sh = "ellipse";
        changeCircle(pt, r, R, sh);
        System.out.println("After changeCircle center is:" + pt +
                ";radius is:" + r +
                ";diameter is:" + R +
                ";shape is:" + sh);
    

结果:

可以看到 我们的radius,diameter,shape的值并未发生变化。

以radius为例,发生了下面的变化:


可以见得基本类型int并没有因为方法体而改变。方法体中改变的是他们的拷贝,而不是他们本身。

令人比较困扰的是对象——Pointer这个类。 

public class Pointer 
    private int x;
    private int y;
    public void setLocation(int x,int y)
        this.x = x ;
        this.y = y;
    

    @Override
    public String toString() 
        return "Pointer" +
                "x=" + x +
                ", y=" + y +
                '';
    

他的值发生了变化,由原来的(0,0)变成了(10,10)。对象传值难道不是按值吗?我们接下来去看。

如果我们删去toString的方法。输出对象,就可以看到控制台显示的是地址。


可以看到对象的值并不是我们主观意识上的x=0,y=0,而是一串地址。

public static void main(String[] args) 
        Pointer pt = new Pointer();
        pt.setLocation(0, 0);
        int r = 5;
        Integer R = 10;
        String sh = "ellipse";
        System.out.println("Before changeCircle center is:" + pt);
        changeCircle(pt, r, R, sh);

        System.out.println("After changeCircle center is:" + pt +
                ";radius is:" + r +
                ";diameter is:" + R +
                ";shape is:" + sh);
    

修改下把进入方法之前的pt输出,结果


可以看到对象的值一直没有发生变化。我们在前例中,修改的并不是java自身定义的对象的值。


换一个例子,我们将更加明确

public class ValueTest 

    public static void main(String[] args) 
        Pointer p1 = new Pointer();
        Pointer p2 = new Pointer();
        p1.setLocation(0,0);
        p2.setLocation(10,10);
        System.out.println("before swap p1:" + p1 + "p2:" + p2);
        swap(p1,p2);
        System.out.println("After swap p1 is:" + p1 +
                "p2 is:" + p2);
    
    public static void swap(Pointer point1,Pointer point2)
        Pointer temp = point1;
        point1 = point2;
        point2 = temp;
        System.out.println("In swap center p1 is:" + point1 + "p2 is:" + point2);
    

那么这次的结果呢?


可见并未发生变化,删去toString继续看看。


一开始:


方法体里可以看到p1和p2的值并未发生改变


也就是说java对于对象的传值也是按值传递。

引申一下,这也就是为什么可能两个对象中的值都相等,但是用“==”得出的结果却可能是false,所以要去比较里面具体的内容是否一致就只能使用equals()了。


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

java方法重载学习笔记

原Java学习笔记015 - 面向对象

7 java 笔记

JAVA学习笔记--策略设计模式与适配器模式

JNI学习笔记2-Java传给C-C代码中向logcat输出内容-C代码回调java方法

Java基础——方法