问大家一个弱智问题,我写了一个简单的数值交换的小方法,可是我运行后发现数值交换根本没有成功,特在此请教大家是怎么回事,谢谢!
static void swap(int x, int y){
int temp;
temp = x;
x = y;
y = temp;
}
public static void main(String[] args){
int a = 3, b= 8;
swap(a, b);
System.out.println("a = " + a + ", b = " + b);
}
static void swap(int x, int y){
int temp;
temp = x;
x = y;
y = temp;
}
public static void main(String[] args){
int a = 3, b= 8;
swap(a, b);
System.out.println("a = " + a + ", b = " + b);
}
解决方案 »
- java 中String对象的SubString效率怎么,会不会照成内存溢出
- 求高手用多线程实现文件归类,单线程的我已经写好了
- 时间转换问题:从格式为"yyyy-MM-dd"的日期转换成距离1970年1月1日的毫秒数,可再从得到的毫秒数怎么也转换不回去原来的日期
- telnet一个机器的端口能通,但是往连到同机器,同端口的socket写入流时候就报错:software caused connection abort: socket write error
- 请教关于局部对象怎样持有?
- 关于println很简单的问题,俺还就是想不通,看看我这四个程序的运行结果
- 请问“jcreator"这个软件在那下载?
- junit如何测试访问数据库的类?
- 急死了 在线等待
- ArrayList类型如何转换成String[]?
- System.gc()和System.runFinalization()功能一模一样吗???
- 管理员,帮帮我,我的结贴率出问题了。
据我理解C语言里参数是传值的,放在这儿确实没有用。
int temp;
temp = x;
x = y;
y = temp;
System.out.println("a = " + x + ", b = " + y); }
你就会发现改变了,原因一楼说了
改变一个拷贝的值不会影响到原来实参的值呀
swap(a, b); //这里的a,b是形参
System.out.println("a = " + a + ", b = " + b); 实际参数和形参是不同的变量来的!
实际上,对象引用进行的是值传递。
public int a;
public int b;
}public class Test {
static void swap(SwapAB aClass){
int temp;
temp = aClass.a;
aClass.a = aClass.b;
aClass.b = temp;
} public static void main(String[] args){
SwapAB swapAB = new SwapAB();
swapAB.a = 3;
swapAB.b= 8;
swap(swapAB);
System.out.println("a = " + swapAB.a + ", b = " + swapAB.b);
}
}这样写很不规范,只是为了说明问题
有人会说JAVA只有传值,这点我也同意,只是在初学的时候还是说明下传递引用值的时候是可以改变对象状态的,而不是就认为是传值引起与基本类型的混淆。所以如果swap两个对象的指向是不可以的,因为他传递的同样是引用值的拷贝
这位仁兄请允许我打破砂锅,为什么传数组行呢?而我传其它对象不行呢?比如:static void swap(String x, String y) {
String temp;
temp = x;
x = y;
y = temp;
} public static void main(String[] args) {
String a = new String("a");
String b = new String("b");
swap(a, b);
System.out.println("a = " + a + ", b = " + b);
}
参数传递用多了就记住了。
不好意思,ref是C#的。。羞愧啊!!
int *x, *y;
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
main()
{
int a = 8, b = 2;
swap(&a, &b);
printf("a = %d, b = %d", a, b);
}但是就是不明白java用数组传递进去就可以,而其它的类型传递进去就不可以,比如:static void swap(int[] array, int x, int y) {
int temp;
temp = array[x];
array[x] = array[y];
array[y] = temp;
}public static void main(String[] args) {
int[] array = {2, 5, 9};
swap(array, 0, 1);
System.out.println("array[0] = " + array[0] + ", array[2] = " + array[2]);
}
分配在栈里的都是值类型。在栈中new的都是引用类型。
只不过这个值是什么的问题?数值:引用.
其实数组名字不就是数组的地址吗?相当于传址了。不过JAVA没有传址一说,好像又打破了,晕,我也晕了
没有引用传递
我觉得值传递和引用传递都只是理解的问题!只要在知道那个传进去的参数里面装的是值还是地址!
就好像基本类型(如int,char,long)他们都分配在栈中,里面装的就是赋给它们的值,而不同的是,其他的引用(在栈中)里面装的是能找到(如String,Long,Integer)new出来的对象(在堆中)的地址,同样数组也是这样的道理。所以我的理解是传的都是里面的内容。只是内容是值还是地址!
而如果x,y是引用的副本的话,它们也只是交换了自己的指向,比如说a及副本x本来是指向Objicet1,b及副本y本来指向Object2,交换后,x就会指向Object2,y就会指向Object1.但是并没有影响到a,b的指向。
public class Test1 { public static void change(int num){
num = num*2;
}
public static void change(Employee e){
e.setSalary(5000);
}
public static void swamp(Employee x,Employee y){
Employee temp = x;
x = y;
y = temp;
}
public static void main(String[] args) {
int number = 10;
change(number); //调用此方法不会改变number的值
System.out.println(number);
Employee a = new Employee("Jim",3000);
Employee b = new Employee("Tom",4000);
change(a);//调用此方法将会改变a对象里的salary值
swamp(a,b);//调用此方法不会改变存储在变量a,b中的对象的引用
System.out.println(a.getSalary());
}}class Employee {
private String name;
private int salary;
public Employee(String name,int salary){
this.name = name;
this.salary = salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
}