http://expert.csdn.net/Expert/topic/1754/1754438.xml?temp=.6287195
解决方案 »
- java怎么将一个图像画到一个指定的圆形区域呢?
- ThreadPoolExecutor 占用的内存结束时需要手动释放吗
- 如何设置使在Myeclipse中能运行servlet
- equals()方法疑问!!!
- (JPanel)getContentPane()問題,高手指點
- 招版主,Java高手进
- 如何像word一样在换行时添加行号,删除中间某些行后下面的行号自动变化??
- 请问哪有JSP的相关试题啊,多谢各位帮忙了!
- eclipse画的图形显示了一瞬间就消失了
- 有两个文本框,当在第一个文本框内输入boy时,回车,第二个文本框显示男子
- 在java中怎么调用C++中的方法??急!!!!!!!!!!
- java连接数据库
{
public static void main(String args[])
{
int a[]=new int[1], b[]=new int[1];
String inputA,inputB;
inputA=JOptionPane.showInputDialog("Enter first integer");
a[0]=Integer.parseInt(inputA);
inputB=JOptionPane.showInputDialog("Enter second integer");
b[0]=Integer.parseInt(inputB);
swap(a,b);
// 下一句要改成:访问数组的值
JOptionPane.showMessageDialog(null,"a is: "+a[0]+" b is: "+b[0],"The result of sawp a and b",JOptionPane.INFORMATION_MESSAGE);
System.exit(0);
}
public static void swap(int[] i,int[]j)
{
int temp;
//int temp[]=new int[1];不要change整个数组
//i=new int[1];这样做是不行的,在函数括号外会被回收
//j=new int[1];
temp=i[0];
i[0]=j[0];
j[0]=temp;
}
}
试试这个
http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=59569
说的很清楚,自己看看。
建议看《Java核心技术 卷I》,第4章“对象和类”中这个问题讲得很清楚。
虽然是传的引用,但是也是要复制的,就是说fun(Interger a,Interger b)
发生函数调用的时候,实际进入函数体的是另外两个Interger,设为a',b',只不过a'=a,b'=b
你函数体内改变了a',b'本身的引用,对a,b当然不会有影响,所以退出函数体的时候仍然没有发生变化.只有改变引用的内容时候,才能退出时保持效果。因为改变a'的内容,就是改变a的内容。(引用的作用)但是改变a'的值对a没有影响的。
道理也明白了。但是究竟在什么情况下
传的引用要复制、什么情况下不复制呢?
再看看这个:
class apple {
public String value;
apple(String value) {
this.value = value;
}
}public class Test {
static void changC(apple d, String value) {
d.value = value;
} public static void main(String[] args) {
{
apple ap1 = new apple("10");
apple ap2 = new apple("20");
System.out.println("----------before change-------------");
System.out.println("ap1 = " + ap1.value + ", " + "ap2 = " + ap2.value);
changC(ap2, "200");
System.out.println("----------after change-------------");
System.out.println("ap1 = " + ap1.value + ", " + "ap2 = " + ap2.value);
}
}
}
Java对于对象的参数传递是传递指针的你的charC方法中你没有改变d的指向对象,d的指向地址没有改变,但是指向地址所
包含对象的内容改变了,这样的操作是会生效的但是那种swap的方法,其实已经改变了参数指向的地址,
param = ... 这样已经不是改变param的值,而是改变了param的指向这种操作是不会生效的,因为原来param所指向的对象的值根本没有改变
首先在java中你读某个指针/引用(随便你叫他什么)都正确,但是要改变它却不正确。因为改的只是在这个代码段中这个指针的指向,而其他地方的都没变。
而面向对象的编程方法不是这样的,
比如
class A{
int x, y;
}如果你想要改变x,y,在面向过程的方法中, 你在任何可以访问x,y的地方中交换x,y就行了。
但是面向对象的方法应该是这样的:
class A{
int x,y;
public void swap(int x, y){
x^=y;y^=x;x^=y;
}
}
这样的好处是,
首先保证了私隐性,其次,还有一个不为人知的好处
class A{
int x, y;
public boolean canSwap(){
return x>y && x!=0;
}
public void swap(){
if(canSwap()){
x^=y;y^=x;x^=y;
}
}
}
所有事关A的事情都在A内完成,保证了其正确性。
因此,除了一些局部变量,我都建议用上述的方法,而局部变量基本上在本地活动。
class A{
Integer a, b;
.....
public void swap(){
Integer temp = a; .....
}
}class B{
public void swap1(A a){
a.swap(); //better
}
public void swap2(A a){
Integer temp = a.a;//a.getA() or so on.
a.a=a.b;//or a.setA(a.b) or so on.
a.b=a.a;
}
}
另外,还有一个简单的方法,
Integer[] integer=new Integer[2];
integer[0]=...;
integer[1]=....;
....
swap(integer);其实,这也是利用了成员变量