Java只有一种参数传递方式,那就是传值

  Java只有一种参数传递方式,那就是传值

当你问大多数程序员Java是传还是传引用的时候,你可能会得到两种答案之一:(1)Java传递原始类型数据时使用的是传方式;传递对象时则使用传引用方式;String类型的数据采用的是传方式,因为字符串是不可变的。(2)Java传递所有参数都使用传方式。

只有第二个答案是正确的。理解传和传引用的区别的关键是要记住,当你向一个方法传递一个对象时,Java没有把对象放入堆栈,它只是拷贝对象的引用然后将这个引用的拷贝放入堆栈。也就是说,根据定义,Java使用的是传方式。

证明
如果Java通过传引用方式传递对象,那么执行下面的代码就会交换保存在两个变量a和b中的引用,而相应的输出应该如下:

a: 4
b: 100
Swapped!
a: 100
b: 4

其实真正的动作是在方法的参数o1和o2中的引用,它并不影响原始变量a和b。下面是其实际输出:

a: 4
b: 100
Swapped!
a: 4
b: 100

public class SwapTip {
    public static void main(String []args) {
        Integer a = new Integer(4);
        Integer b = new Integer(100);

        System.out.println("a: " + a);
        System.out.println("b: " + b);

        swap(a, b);

        System.out.println("Swapped!");
        System.out.println("a: " + a);
        System.out.println("b: " + b);
    }

    public static void swap(Object o1, Object o2) {
        Object t = o1;
        o1 = o2;
        o2 = t;
    }
}

为什么说这个争论的答案是有意义的?
很多参与过争论传递参数的方式的程序员最后都会说:“只是语义不同而已”或者是“没有关系,因为都理解它真正的工作原理。”

对于有经验的程序员来说这可能是一个语义问题,但是对于那么没有什么经验的程序员来说,情况就不一样了。对于程序员来说一个语言的黑拿越少,他们在用那种语言写程序的时候就能做得越好。

一个类比

对象引用与实例的关系就像遥控器与电视机的关系,引用控制对象就像遥控器控制电视机一样。如果一个遥控器的复制品给了另一个人,那么那个人也可以控制电视机。复制的遥控器对电视机的动作(比如说调节音量、改换频道或者调节时钟)对于它本身和原装遥控器来说都是可见的。如果那个人改装了复制的遥控器去控制另外一台电视机,那么原来的遥控器不会受到影响。

诚然,Java是通过传还是传引用的方式来传递参数只是一个学术上的区别,只要我们知道期望哪种行为即可。但是有时候知道台后的事情也是重要的。

Java只有一种参数传递方式,那就是传。它简单、有文档可查并且确实是如此。所以在下次你听到这个问题的时候你就会知道正确答案。


--------------------------------------------------------------------------------
本文作者: David Petersheim是Genscape公司的一位资深Java 开发人员。他设计和开发服务器端应用程序来获取和处理实时能源数据。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中实现两个窗体间的数据传递可以通过构造函数、setter方法和接口回调实现。 1. 构造函数传值 假设有两个窗体A和B,需要将A中的数据传递给B,可以在B的构造函数中添加参数,将A中的数据传递给B。 在A中: ```java public class A { private String data; private B b; public A() { b = new B(data); } } ``` 在B中: ```java public class B { private String data; public B(String data) { this.data = data; } } ``` 2. setter方法传值 如果A中的数据需要在B中动态改变,可以使用setter方法进行传值。 在A中: ```java public class A { private String data; private B b; public void setData(String data) { this.data = data; b.setData(data); } } ``` 在B中: ```java public class B { private String data; public void setData(String data) { this.data = data; } } ``` 3. 接口回调传值 在A中定义一个接口,B实现该接口,并将B的实例作为参数传递给A。当A中的数据发生变化时,调用接口中的方法通知B更新数据。 在A中: ```java public interface DataChangeListener { void onDataChange(String data); } public class A { private String data; private DataChangeListener listener; public void setListener(DataChangeListener listener) { this.listener = listener; } public void setData(String data) { this.data = data; if (listener != null) { listener.onDataChange(data); } } } ``` 在B中: ```java public class B implements DataChangeListener { private String data; @Override public void onDataChange(String data) { this.data = data; } } ``` 通过以上三种方式,可以实现Java中两个窗体之间的数据传递。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值