如下代碼會出問題
public class C {
private String c1;
private String c2;
public void setC1(String c1) {
this.c1 = c1;
}
public String getC1() {
return this.c1;
}
public void setC2(String c2) {
this.c2 = c2;
}
public String getC2() {
return this.c2;
}
}
public abstract class A extends Composite {
public A(Composite parent, int style) {
super(parent, style);
createMainBody(parent);
createOtherBox();
}
protected abstract void createMainBody(Composite parent);
protected abstract void createOtherBox(Composite parent);
}
public class B extends A{
private Text b1 = null; //VE生成的
...
private C c = new C();
public B(Composite parent, int style) {
super(parent, style);
}
protected void createMainBody(Composite parent) {
b1 = new Text(parent, SWT.NONE);
b1.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
c.setC1(b1.getText());
fireFormDataChange();
}
});
b1.setText("Hello...");
...
}
...
}
一運行代碼出錯了,經(jīng)過調(diào)試才發(fā)現(xiàn)B初始化時,在super(..)執(zhí)行完之前并沒有初始化本類(這是對的),自己的代碼實現(xiàn)有問題.
注意:類初始化時,首先初始化父類,再初始化本類的變量聲明部分,初始化父類時如果回調(diào)到子類的某些類的實現(xiàn),而這些實現(xiàn)方法又完成了對聲明變量的創(chuàng)建,再回來初始化本類時,如果聲明變量有初始值,又會將這些變量設(shè)置到初始值狀態(tài),因此,會發(fā)現(xiàn)這些變量無法訪問了.一切都是對的,只是自己太相信VE生成的代碼了.
改動很簡單,只是將
public class B extend A {
private Text b1;
...
private C c;
public B(Composite parent, int style) {
super(parent, style);
}
protected void createMainBody(Composite parent) {
c = new C();
...
}
}
好,這樣就一切OK.類的初始化過程的學(xué)習(xí)還是很重要的.