0

ビットマップが値または参照によって渡されるかどうかを確認するために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はまだhvthing00

  • b2(1,1)は255です

問題は、テスト2と3が互いに矛盾していることです。test2は、b2がnullにならなかったため、b2が値渡しされることを示しています。しかし、ビットマップが値で渡される場合、test3では、setPixel()はb2(関数スコープ内のもの)のコピーで機能するはずですが、なぜb2(外部スコープ)がそのピクセル値を変更するのですか?psロードされたビットマップは濃い赤色です。

4

2 に答える 2

2

これは、Android や Bitmap がどのように機能するかというよりも、Java が機能する方法に関係しています。Java は参照で渡します。より完全な説明は、http://www.javaworld.com/javaqa/2000-05/03-qa-0526-pass.htmlにあります。

于 2013-02-06T17:22:45.487 に答える
0

Java は常に値渡しです

Java の関数に変数を渡すたびに、その参照がコピーされます。Java の関数から結果を取得すると、returnそれはオブジェクトの参照の新しいコピーになります。

ここで、関数がどのようにtest()機能するかを段階的に示します。

  • b2 throw を渡すと、test(b2); を呼び出します。b2 のオブジェクト b への新しい参照を取得します。
  • 次に、その参照を null に設定します。とにかくアクセスできないため、スコープ外の参照に影響を与えていません。

それが役立つことを願っています。この詳細な質問を見てください:

Javaは「参照渡し」または「値渡し」ですか?

于 2013-02-06T17:28:08.047 に答える