我的类A在其构造函数中创建一个类B的实例。类B的构造函数创建其内部类C的实例。类C在其构造函数中需要一个字段来自类A,这就是问题所在。 C类仅达到A字段的默认值。
在开始启动B和C之前,我在A的构造函数中初始化A的字段的值。我检查了该字段是否具有我需要的值。然而,C中构造函数中该字段的值始终是默认值。 我不知道如何处理这个问题。有什么帮助吗?
谢谢!
谢谢大家的所有答案!我觉得有必要提供更多信息。
这是我的A类的一部分:有问题的变量是startX和startY。我在构造函数中直接定义了它们,通过setter方法定义了ether。 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类构造函数:
//
public DrawView(Context context,AttributeSet attrs){ super(context,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;
答案 0 :(得分:3)
在A类的构造函数完成之前(这意味着B和C的构造函数已经完成),最好假设您无权访问A的完全构造和填充的实例。您应该向下传递你将A.field设置为B类的构造函数并以这种方式引用它。
答案 1 :(得分:0)
你可以在A类中创建一个访问字段A值的函数。然后只需将类A的实例一直传递给C类。没有更多细节,我认为我不能给出更详细的信息。答案。
答案 2 :(得分: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();
}
}
如果您尝试访问的值实际上是对象字段(即不是static
),则情况并非如此 - 直到该对象才真正创建构造函数完成。
在您的具体案例中可能还有其他影响这一点的事情 - 您没有提及的类加载器,线程等。