Java通过值或引用传递?

时间:2013-02-06 17:14:13

标签: java function parameter-passing

我进行了3次测试以检查位图是否通过值或引用传递但在运行以下代码后感到困惑:

public class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    V v = new V(this);
    setContentView(v);
}

class V extends View{
    Bitmap b1;
    Bitmap b2;

    public V(Context context) {
        super(context);
        //load bitmap1
        InputStream is = getResources().openRawResource(R.drawable.missu);
        b1 = BitmapFactory.decodeStream(is);
        //testing start
        b2 = b1;
        //b1 = null; 
        //1.test if b1 and b2 are different instances
        if(b2 == null){
            Log.d("","b2 is null");
        }
        else{
            Log.d("","b2 still hv thing");
        }
        //2.test if b2 is pass by ref or value
        test(b2);
        if(b2 == null){
            Log.d("","b2 is null00");
        }
        else{ 
            Log.d("","b2 still hv thing00");
        }
                    //3.want to further confirm test2
        b2 = b2.copy(Config.ARGB_8888, true);
                    settpixel(b2); 
        if(b2.getPixel(1, 1) == Color.argb(255,255, 255, 255)){
            Log.d("","b2(1,1) is 255");
        }
        else{
            Log.d("","b2(1,1) is not 255");
        }
    }

    void test(Bitmap b){
        b = null;
    }
    void settpixel(Bitmap b){
        b.setPixel(1, 1, Color.argb(255,255, 255, 255));
    }
}}

结果:

  • b2仍然是hv的东西

  • b2仍然是hv thing00

  • b2(1,1)是255

问题是测试2和3相互矛盾。 test2表明b2是按值传递的,因为b2没有变为null。但是如果位图是按值传递的,那么在test3中,setPixel()应该处理b2的副本(函数作用域中的那个),但为什么b2(外部作用域)会改变它的像素值?附:加载的位图为深红色。

2 个答案:

答案 0 :(得分:2)

这与Java的工作方式有关,而不是Android或Bitmap的工作方式。 Java通过 value 传递引用。可以在http://www.javaworld.com/javaqa/2000-05/03-qa-0526-pass.html

找到更全面的解释

答案 1 :(得分:0)

JAVA总是值得通过

每次将变量传递给java函数时,您都要复制其引用,当您从java return中的函数获得结果时,它是该对象引用的新副本。

现在,您可以逐步了解test()功能的工作原理:

  • 当你通过b2投掷测试(b2);你将得到一个名为b。
  • 的b2对象的新引用
  • 然后将该引用设置为null。您不会影响范围之外的参考,因为无论如何都无法访问它。

希望有所帮助。请看一下这个详细的问题:

Is Java "pass-by-reference" or "pass-by-value"?