0

我的 A 类在其构造函数中创建了 B 类的实例。B 类的构造函数创建了其内部类 C 的实例。C 类在其构造函数中需要 A 类的字段,这就是问题所在。C 类仅达到 A 的字段的默认值。

在启动 B 和 C 之前,我在 A 的构造函数中初始化了 A 的字段的值。我检查了该字段是否具有我需要的值。尽管如此,C 的构造函数中该字段的值始终是默认值。我不知道如何处理这个问题。有什么帮助吗?

谢谢!

谢谢大家的回答!我觉得虽然有必要提供更多信息。

这是我的 A 类的一部分:有问题的变量是 startX 和 startY。我通过setter方法直接在构造函数中定义它们。B 类是 DrawView。C类是DrawThread。我不知道如何将参数传递给 DrawView 的构造函数,否则我会的。帮助?另一种选择是使用 /*display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();

在 DrawView 或 DrawThread 中设置我的 startX 和 startY,但它就是不想工作。现在,这确实将我的问题更多地转移到了android上,对于如何在DrawThread的构造函数中获取屏幕大小的任何建议,我将不胜感激,这是所有这些的最终目标:)?

公共类 ColorAnimation 扩展 Activity {

    public static float startX;

    public static float startY;

             //other stuff here

             @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // turn off the window's title bar
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        // tell system to use the layout defined in our XML file
        setContentView(R.layout.main);
        /*display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();

        startX = display.getWidth();
        startY = display.getHeight();*/

        mDrawView = (DrawView) findViewById(R.id.pend);
        mDrawThread = mDrawView.getThread();

        // give the DrawView a handle to the TextView used for messages
        mDrawView.setTextView((TextView) findViewById(R.id.text));

B类的构造函数:

//

公共DrawView(上下文上下文,AttributeSet attrs){超级(上下文,attrs);

    // register our interest in hearing about changes to our surface
    SurfaceHolder holder = getHolder();

    holder.addCallback(this);

    thread = new DrawThread(holder, context, new Handler() {

        @Override
        public void handleMessage(Message m) {
            mStatusText.setVisibility(m.getData().getInt("viz"));
            mStatusText.setText(m.getData().getString("text"));
        }
    });

    setFocusable(true); // make sure we get key events
}

//C类DrawThread的一部分:

类 DrawView 扩展 SurfaceView 实现 SurfaceHolder.Callback {

    class DrawThread extends Thread {//................
         //..............


    public DrawThread(SurfaceHolder surfaceHolder, Context context,
            Handler handler) {
        // get handles to some important objects
        mSurfaceHolder = surfaceHolder;
        mHandler = handler;
        mContext = context; 
4

3 回答 3

3

在类 A 的构造函数完成之前(这意味着 B 和 C 的构造函数已经完成),最好假设您无权访问 A 的完全构造和填充的实例。您应该传递您的值'将 A.field 设置为 B 类的构造函数并以这种方式引用它。

于 2011-10-25T16:36:42.540 回答
0

您可以在 A 类中创建一个访问字段 A 值的函数。然后将 A 类的实例一直传递给 C 类。如果没有更多细节,我想我无法给出更详细的答案。

于 2011-10-25T16:31:30.243 回答
0

如果它真的是一个字段,那么它应该可以工作。此 SSCCE 始终返回“A SET IT”。

class A {

    public static String VALUE = "default";

    public A() {
        VALUE = "A SET IT";
        B b = new B();
    }

}

class B {

    public B() {
        C c = new C();
    }

    public static class C {
        public C() {
            String value = A.VALUE;
            System.out.print(value);
        }
    }
}


public class Runner {
    public static void main(String[] args) {
        A a = new A();
    }
}

如果您尝试访问的值确实是一个对象字段(即 not static),则情况并非如此 - 直到构造函数完成后才真正创建对象。

在您的特定情况下,可能还有其他影响这一点的因素 - 您没有提到的类加载器、线程等。

于 2011-10-25T16:48:39.687 回答