簡體   English   中英

如何通過類A將Java中的對象從類B傳遞到類C而不重復

[英]How do I pass an object in Java from Class B to Class C via Class A without duplication

假設我有3個班級。

  • A類(擴展活動)
    B級
    C類(擴展視圖)

A創建一個包含Bitmap的B對象。 A也使C. C的onDraw在其Canvas繪制一個Bitmap無效。

如何繪制Bitmap是b持有,而無需創建另一個Bitmap中C對象? 請注意,保持相同的“類結構”對我來說很重要。

這是偽代碼。 你可以看到這把2個Bitmap對象放在內存中。 謝謝!

public class A extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        B b = new B();
        C c = (C) findViewById(R.id.c);

        c.passTheBitmap(b.bitmap);
        c.postInvalidate();
    }       
}

public class B {
    public Bitmap bitmap;
    public B(){
        bitmap = BitmapFactory.decodeResource(ActivityAContext.getResources(), R.drawable.fooBitmap);
    }
}

public class C extends View {
    public Bitmap bitmap;

    public C(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public passTheBitmap(Bitmap b) {
        bitmap = b;
    }
    @Override
    public void onDraw(Canvas canvas) {
        if (bitmap != null) {
            canvas.drawBitmap(bitmap, 0, 0, null);
        }
    }
}

好吧,通過在C中聲明實例變量,你並沒有完全復制C中的Bitmap對象。你只是對在B的構造函數中創建的原始Bitmap對象有另一個引用。

我假設您認為以下行:

c.passTheBitmap(b.bitmap);

會導致b.bitmap被復制。 只要b.bitmap不是原語, b.bitmap不會。

在您的代碼中,存在第二個副本的唯一方法是使用new來有意創建新對象。

例如在C

public passTheBitmap(Bitmap b) {
    bitmap = new Bitmap(b);
}

如果你這樣做:

public passTheBitmap(Bitmap b) {
    bitmap = b;
}

...然后Abbitmap和C.bitmap將在內存中引用相同的對象。

如果這是C ++,那么你有一個有效的問題 - 但在Java中,你正在做的事情並沒有復制傳遞的對象。

HTH

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM