java学习笔记(1):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()了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值