Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用call by reference交换两个号码_Java_Methods_Pass By Reference_Swap_Pass By Value - Fatal编程技术网

Java 使用call by reference交换两个号码

Java 使用call by reference交换两个号码,java,methods,pass-by-reference,swap,pass-by-value,Java,Methods,Pass By Reference,Swap,Pass By Value,在Java中,我们可以使用passbyreference或callbyreference交换两个数字吗? 最近,当我在Java中遇到交换两个数字时,我写了 class Swap{ int a,b; void getNos(){ System.out.println("input nos"); a = scan.nextInt(); b = scan.nextInt(); // where scan is object of scan

在Java中,我们可以使用passbyreference或callbyreference交换两个数字吗? 最近,当我在Java中遇到交换两个数字时,我写了

class Swap{
    int a,b;
    void getNos(){
        System.out.println("input nos");
        a = scan.nextInt();
        b = scan.nextInt(); // where scan is object of scanner class
    }
    void swap(){
        int temp;
        temp = this.a;
        this.a = thisb;
        this.b = this.a;
    }
}
在main方法中,我调用上述方法并取两个整数
a
b
,然后使用第二个方法交换这两个数字,但与对象本身相关

该程序或逻辑是否属于通过引用?
这是正确的解决方案吗?

是和否。Java从不通过引用传递,您的方法是一种变通方法。但是你创建一个类只是为了交换两个整数。相反,您可以创建一个int包装并使用pass-it,这样在不需要时可以分隔整数:

public class IntWrapper {
    public int value;
}

// Somewhere else
public void swap(IntWrapper a, IntWrapper b) {
    int temp = a.value;
    a.value = b.value;
    b.value = temp;
}

正如评论所显示的那样,我可能还不够清楚,所以让我详细说明一下

通过引用传递是什么意思?这意味着,当您将一个参数传递给该方法时,您可以在该方法中更改原始参数本身

例如,如果Java是通过引用传递的,则以下代码将打印出来
x=1

public class Example {
    private static void bar(int y) {
        y = 10;
    }
    public static void main(String[] args) {
        int x = 1;
        bar(x);
        System.out.println("x = " + x);
    }
}
但正如我们所知,它打印0,因为传递给
bar
方法的参数是原始
x
的副本,对它的任何赋值都不会影响
x

以下C程序也是如此:

static void bar(int y) {
    y = 1;
}
int main(int argc, char * argc[]) {
    int x = 0;
    bar(x);
    printf("x = %d\n", x);
}
如果我们想更改
x
,我们必须传递其引用(地址),如以下示例所示,但即使在这种情况下,我们也不会传递实际引用,而是传递引用的副本,通过取消引用,我们将能够修改x的实际值。但是,对引用的直接赋值不会改变引用本身,因为它是通过值传递的:

static void bar(int &y) {
    *y = 1;
    y = NULL;
}
int main(int argc, char * argc[]) {
    int x = 0;
    int * px = &x;
    bar(px);
    printf("x = %d\n", x); // now it will print 1
    printf("px = %p\n", px); // this will still print the original address of x, not 0
}
因此,传递变量的地址而不是变量本身解决了C中的问题。但是在Java中,由于没有地址,我们需要在分配变量时包装变量。在只修改对象的情况下,我们没有这个问题,但是,如果我们想分配给它,我们必须包装它,如第一个示例所示。这不仅适用于原语,也适用于对象,包括我刚才提到的包装器对象。我将用一个(更长)的例子来说明:


好的,就是这样,我希望我说得很清楚(并且没有犯太多错误)

Java没有“按引用调用”。Java没有按引用传递,但它不是在将类的对象传递给方法时传递的引用吗?我现在对这个话题有疑问。。。。当我阅读Sun的核心java基础时,书中指出当你创建一个对象时,你的目标代码实际上是指针类似物WRT C++,也就是它是一个从未提到过的术语。Java只是不通过引用传递。即使传递了引用(对象引用),也不能在方法中更改引用,只能更改它引用的对象。在Java中,不传递对象,只传递引用。甚至
objectO1=o2
也不是在处理对象,而是在处理引用。因此
f(o1)
也按值传递引用(这与按引用传递不同)。在我的经验中,任何人都不正确地或不直接地引用这个机制“通过引用”,或者不知道他在说什么,或者尝试在某些情况下,但在其他情况下不使用快捷方式。如果您在C++中写了上面的代码,您将定义<代码> SWAP-()/<代码> >代码>无效交换。(IntWrapper*a,IntWrapper*b)。因此,在某种意义上,您是在传递对象作为引用。由于Java对您隐藏了引用/取消引用过程,因此,Java人员称此为“按值传递”,即使“值”事实上,这是一个引用!我发现术语也混淆了,所以我更关注它是如何工作的,而不是在它被调用的方面。@即使在C/C++中,你的建议也会是“通过值”,因为你传递的是指针,而不是对象。只有C++支持用“代码>交换”(int和a,int和b)的实际引用。;@EserAygün:两点:在机器代码级别上,它可能是相同的。但是术语不是基于这样的实现细节,而是基于语言(这里是Java)本身的可见效果。第二点:如果语言不支持按引用传递,而是支持某种指针(C)或某种引用类型(Java),则作为该语言的用户,您可以通过使用间接方式来模拟PBR的某些(并非全部)效果。这种手动间接方式通常被错误地命名为“通过引用传递”——作为一种语言快捷方式。
public class Wrapper {
    int value;
    private static changeValue(Wrapper w) {
        w.value = 1;
    }
    private static assignWrapper(Wrapper w) {
        w = new Wrapper();
        w.value = 2;
    }
    public static void main(String[] args) {
        Wrapper wrapper = new Wrapper();
        wrapper.value = 0;
        changeValue(wrapper);
        System.out.println("wrapper.value = " + wrapper.value); 
        // will print wrapper.value = 1
        assignWrapper(w);
        System.out.println("wrapper.value = " + wrapper.value); 
        // will still print wrapper.value = 1
    }
}
import java.util.*;
public class Main
{
  int a,b;


void swap(Main ob)
{
    int tmp=ob.a;
    ob.a=ob.b;
    ob.b=tmp;
}

void get()
{
    Scanner sc=new Scanner(System.in);
    System.out.println("Enter a and b: ");
    a=sc.nextInt();
    b=sc.nextInt();
}

public static void main(String[] args) {
    Main ob=new Main();
    ob.get();
    ob.swap(ob);
    System.out.println(ob.a+" "+ob.b);
}}