我们可以使用传递引用或通过引用调用在Java中交换两个数字吗? 最近,当我遇到用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
,然后使用第二种方法我交换两个数字,但相对于对象本身....
此程序或逻辑是否通过引用传递? 这是正确的解决方案吗?
答案 0 :(得分:6)
是和否。 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
的值,我们将必须传递其引用(地址),如下例所示,但即使在这种情况下,我们也不会传递实际引用,但< strong>副本的引用,通过解除引用,我们将能够修改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中,由于我们没有地址,我们需要在我们想要分配它时包装变量。在仅修改对象的情况下,我们没有那个问题,但是,如果我们想要分配它,我们必须包装它,如第一个例子中那样。这不仅适用于原始对象,也适用于对象,包括我刚刚提到的那些包装器对象。我将在一个(更长的)示例中显示它:
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
}
}
嗯,就是这样,我希望我说清楚(并没有犯太多错误)
答案 1 :(得分:0)
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);
}}