Java 使用call by reference交换两个号码
在Java中,我们可以使用passbyreference或callbyreference交换两个数字吗? 最近,当我在Java中遇到交换两个数字时,我写了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
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);
}}