当我尝试从子类访问超类中定义的字符串时,我得到一个空值

时间:2011-07-01 19:34:48

标签: java

我的代码是:

public class Register_window extends javax.swing.JFrame
{
    String u;
.
.
.
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) 
    {
        try
        {
            .
            .
            u=jTextField.getText();

            .
            .
        }
    }
}



public class Data_storer extends Register_window
{
    public Vector people_database() throws Exception 
    {
        .
        .
        .

        System.out.println("The name of the user as printed in Data_storer(inherited from Register_window) is:" + u);
        .
        .
        .
    }
}

3 个答案:

答案 0 :(得分:2)

你需要初始化你。您假设在jButton1ActionPerformed之前调用people_database

答案 1 :(得分:1)

您确定要向u分配任何内容吗?如果您从未单击过jbutton1(因此未调用jButton1ActionPerformed),则u实际上将为null

答案 2 :(得分:0)

你的问题与此类似:

public class FooA {
   public static void main(String[] args) {
      A a = new A();
      a.setFieldA("bar");

      B b = new B();
      System.out.println(b.getFieldA()); // this will still print "foo"
   }
}

class A {
   String fieldA = "foo";

   public void setFieldA(String a) {
      this.fieldA = a;
   }

   public String getFieldA() {
      return fieldA;
   }
}

class B extends A {

}

如果对对象a中的fieldA进行了更改,则它不会影响对象b,因为它们都带有不同的fieldA。解决这个问题的方法是不扩展A,而是像C类一样构造你的第二个类,使用对当前A对象的引用,然后根据需要从A对象中提取必要的信息:

class C {
   private A a;

   C(A a) {
      this.a = a;
   }

   public String getAFieldA() {
      return a.getFieldA();
   }
}

然后在主要部分你可以做:

public class FooA {
   public static void main(String[] args) {
      A a = new A();
      a.setFieldA("bar");

      B b = new B();
      System.out.println(b.getFieldA()); // this will still print "foo"

      C c = new C(a); 
      System.out.println(c.getAFieldA()); // this will print "bar"
   }
}

转换为您的代码,它看起来像这样:

public class Register_window extends javax.swing.JFrame {
   private JTextField jTextField = new JTextField();
   // String u; // this is not necessary

   // ...

   private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
      try {
         // ...

         // somehow notify Data_storer that a field has changed.

         // ...
      } finally {

      }
   }

   public String getTextFieldText() {
      return jTextField.getText();
   }
}

Data_storer类:

public class Data_storer extends Register_window {
   private Register_window registerWindow;

   // pass the current visualized Register_window instance into constructor       
   public Data_storer(Register_window register_window) {
      this.registerWindow = register_window;
   }

   public Vector people_database() throws Exception {
      // ...

      System.out.println("The name of the user as printed in Data_storer(inherited from Register_window) is:"
                        + registerWindow.getTextFieldText());
      // ...

   }
}

另一种可能的解决方案是扭转局面,使GUI保存数据存储器的实例,并在按钮按下时将信息“推送”到数据存储器对象中,这实际上对我来说更有意义。例如:

public class Register_window extends javax.swing.JFrame {
   private JTextField jTextField = new JTextField();
   private Data_storer dataStorer = new Data_storer();

   // ...

   private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
      try {
         // ...
         Vector vect = dataStorer.people_database(jTextField.getText());
         // do something with the vect here

      } 

      //...
   }

}

class Data_storer extends Register_window {


   public Vector people_database(String text) {

      //...
   }
}