有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

按引用传递为什么Java不允许方法参数使用C#“out”特性

Possible Duplicate:
Why there is no way to pass by reference in java

有人能告诉我为什么Java在处理通过引用传递的方法参数时不提供C#“out”类型的特性吗? 我的意思是,为什么它不允许我们传递原始数据类型,比如布尔值,通过引用传递。我也尝试过使用包装类java。lang.布尔值,但仍然无效。它仍然不允许我通过引用传递变量
Java在版本7中仍然没有向我们提供这一功能,有什么具体原因吗


共 (4) 个答案

  1. # 1 楼答案

    这只是我的观点,但我觉得Java的设计者相信他们可以通过消除特性而不是让特性更直观、更容易处理来简化编程

  2. # 2 楼答案

    只有语言设计团队可以告诉您原因,但我相信不允许“out”参数的原因可能是:如果您想要一个计算两件事的方法,那么您真正想要的是两个方法,或者一个返回对象的方法这可能会导致更好的设计和更易于维护的代码

    请注意,如果确实需要“out参数”,可以轻松使用一个元素的数组。例如:

    void div(int a, int b, int[] q, int[] r) {
        if (q != null) q[0] = a/b;
        if (r != null) r[0] = a%b;
    }
    
    // elsewhere:
    int[] quotient = new int[1];
    int[] remainder = new int[1];
    div(4, 3, quotient, remainder);
    
  3. # 3 楼答案

    Java只有传递值。这是在设计语言时作出的决定

    There is exactly one parameter passing mode -- pass by value -- and that helps keep things simple.

    -- James Gosling, et al., The Java Programming Language, 4th Edition

    如果需要,可以将布尔值作为成员放入可变类中(不能使用Boolean,因为它是不可变的),并传递对该类的引用。Apache Commons甚至有一个名为^{}的类,您可以使用它

  4. # 4 楼答案

    简单的回答是,这是一个设计决策,通过引用传递没有什么比通过值传递对象引用做不到的

    对于您的特定问题,有两种解决方案:

    可变包装器类:

    final class BooleanRef {
        public boolean value;
    }
    

    并将其用作:

    // Function
    void changeTheBoolean( BooleanRef b ){
        b.value = true;
    }
    
    // Call:
    BooleanRef b = new BooleanRef();
    changeTheBoolean( b );
    

    或者,(更粗俗但更轻巧)封装在阵列中:

    // Function
    void changeTheBoolean( boolean[] b ){
        b[0] = true;
    }
    
    // Call:
    boolean[] b = new boolean[1];
    changeTheBoolean( b );