还是《Java编程思想》上的一个问题:
“将一个对象传递给方法时,也会产生别名问题:”以下是示例: import static net.mindview.util.Print.*; class Letter {
char c;
}
public class PassObject {
static void f(Letter y) {
y.c = 'z';
}
public static void main(String[] args) {
Letter x = new Letter();
x.c = 'a';
print("1: x.c " + x.c);
f(x);
print("2: x.c " + x.c);
}
} 其输出结果为:
1: x.c = a
2: x.c = z
然后作者又说
“在许多编程语言中,方法f()似乎要在它的作用域内复制其参数Letter y的一个副本;但实际上只是传递了一个引用。所以代码行
y.c = 'z';
实际改变的是f()之外的对象。”
对这段话不是太理解:
1、“但实际上只是传递了一个引用”是说f(x)中的x是指向f()方法的一个引用吗?
2、“所以代码行
y.c = 'z';
实际改变的是f()之外的对象。”
这句话又该怎么理解?
问题表达得可能不是很清楚,各位费心了。
“将一个对象传递给方法时,也会产生别名问题:”以下是示例: import static net.mindview.util.Print.*; class Letter {
char c;
}
public class PassObject {
static void f(Letter y) {
y.c = 'z';
}
public static void main(String[] args) {
Letter x = new Letter();
x.c = 'a';
print("1: x.c " + x.c);
f(x);
print("2: x.c " + x.c);
}
} 其输出结果为:
1: x.c = a
2: x.c = z
然后作者又说
“在许多编程语言中,方法f()似乎要在它的作用域内复制其参数Letter y的一个副本;但实际上只是传递了一个引用。所以代码行
y.c = 'z';
实际改变的是f()之外的对象。”
对这段话不是太理解:
1、“但实际上只是传递了一个引用”是说f(x)中的x是指向f()方法的一个引用吗?
2、“所以代码行
y.c = 'z';
实际改变的是f()之外的对象。”
这句话又该怎么理解?
问题表达得可能不是很清楚,各位费心了。
解决方案 »
- 求高手赐教,我的java程序到底哪里出错了!?
- 低价转让本书:Java程序设计教程(第五版)
- 小小的作业算法问题给出答案者立刻结贴给100分!---速度在线等待
- 怎么样的代码可以产生让java产生hs_err_pid${PID}.log这种日志
- 如何判断一个点在任意多边形的内部?
- 请大家帮帮我看看我的程序到底出了什么问题,谢谢了
- 关于线程同步的问题!
- 关于JTree重画问题.解决送100!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- 用jswdk的兄弟来帮帮忙吧!
- 一个.class文件内容如何组织安排?
- swing面板间参数传递
- 把字符串"public int add(int m,int n)分解成一个字符串数组
跟果子大神一样的观点哦 最近有啥推荐的JAVA书么? 除了核心技术和这本书..最好有电子版
Letter x = new Letter();
所产生的Letter对象在堆内存中的地址。
x---
+---->Letter Object
y---所谓“复制的副本”,就是将x的内容(Letter对象的地址)复制给y,y的内容是x的内容是一样的,都用Letter对象的地址,这样一来x,y都指到了堆内存的同一个地方,这就指到了同一个对象。
class A {
int row = 10;
}
public class ReferOrValue {
int line = 1;
public void setNum(int num){
num++;//在许多编程语言中,方法似乎要在它的作用域内复制其参数的一个副本
}
public void setRow(A a){
a.row = 20;//若传的是对象 ,副本和母本的值相同,指向了同一个对象,
//所以对副本指向的对象的操作会改变母本指向的对象的属性
}
public static void main(String[] args) {
ReferOrValue r = new ReferOrValue();
int num = 100;
r.setNum(num);
System.out.println(num);//100//在许多编程语言中,方法似乎要在它的作用域内复制其参数的一个副本
A a = new A();
System.out.println(a.row);//10
r.setRow(a);
System.out.println(a.row);//20
}
}
参数是基础类型或对象时,都是传的值,只是它们的值的本质区别导致的不同效果!
这是自己写的一个测试程序,不好要轻拍哦!
http://topic.csdn.net/u/20100414/14/a6290ab8-79c4-4904-8b31-9e364c64c1d2.html?seed=1624237131&r=64684169#r_64684169里面的例子比我的更具有说服力!