2012-06-20 35 views
1

好吧,这绝对是一个n00b问题,但在这里。在方法内改变类成员?

我的理解是,Java中的对象是通过值传递的,而不是引用。那么你怎样通过将方法的引用传递给方法来改变方法中的类成员呢?

我知道这是可以做到的,因为该方法getRotationMatrix做它...即如果我写在类级别以下:

private float rotationMatrix[] = new float[9]; 

,然后在方法中我称之为:

SensorManager.getRotationMatrix(rotationMatrix, inclinationMatrix, gData, mData); 

它会改变rotationMatrix。我的问题是,如果一切都按值传递,那么该方法如何改变我传递的对象中的内容?

我问的原因是我试图写一个方法,做同样的事情,但不断运行到传递值的难题。我试图通过传递一个方法来初始化一个FloatBuffer。

+1

你有它向后。 Java中的对象总是按引用传递,并且基元总是按值传递。 – Maxpm

+1

对该对象的引用是按值传递的......这就是为什么在将对象传递给方法时交换不起作用,即使您正在尝试交换对象。 http://www.javaworld.com/javaqa/2000-05/03-qa-0526-pass.html – Joey

+0

@Joey +1的准确性和链接 – alfasin

回答

3

对象是按值传递的。但是对象是一个引用,所以引用的副本被传递。使用引用可以修改对象,但更改引用不会对调用者有任何影响。

例如:

List list = new ArrayList(); 
modifyList(list); 
noOp(list); 

void modifyList(List l) 
{ 
    l.add("A"); // A is added to list 
} 

void noOp(List l) 
{ 
    l = null; // No effect to list, you are modifying local variable l. 
} 
+0

所以,如果我有这种方法: private void initBuffer (浮动[]数据,FloatBuffer缓冲液) { \t \t缓冲液= ByteBuffer.allocateDirect(data.length * 4).order(ByteOrder.nativeOrder())asFloatBuffer(); \t \t buffer.put(data); \t \t buffer.position(0); \t} 它实际上不会改变FloatBuffer我通过它...我怎么会正确地做到这一点? – Joey

+0

对不起,我对代码进行了格式化,但是当我发布评论时,它仍然一起缩小了它。 – Joey

+1

@Joey有很多选择:1.你可以让你的方法返回新的缓冲区并将其分配给必填字段。 I.e myBuffer = yourMethodThatCreatesNewBuffer(...)。 2.您可以添加方法来修改FloatBuffer本身,即myBuffer.reallocate(...) –

0

Java对象通过引用传递。您可能会将引用与原始值混淆,原始值总是按值传递。

0

好吧,如果你正在处理的Java对象,那么就知道有两件事情。第一个是对象,第二个是对象的引用。因此,当你将一个对象的引用传递给一个方法时,那么引用本身就是按值传递的,即在你的方法中创建的新引用与传入的方法相同。但是请记住,尽管参考文献被复制,但是对象已经可以被这个新参考文件所操纵。

SensorManager.getRotationMatrix(rotationMatrix, inclinationMatrix, gData, mData); 

在你的例子中,getRotationMatrix()方法被赋予一个新的rotationMatrix引用。但是通过这个引用,没有人能阻止你操纵实际的Array对象。

相关问题