java中不正确的对象创建

时间:2012-09-19 14:35:56

标签: java swing

public class welcomepage extends javax.swing.JFrame {
    backendcode bec;
    String username;
    public welcomepage() {
            initComponents();
            username=null;
            backendcode bec= new backendcode("dummy");
            System.out.println("bec created "+ bec);
    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
            System.out.println("bec created "+ bec);
            bec.back_login_credentials(username);
    }
    /*
    and other private methods(not mentioned here) which also needs to access bec object
    */
}

 public class backendcode {
     public backendcode(String dummy) {
           //some code
     }
     public void back_login_credentials(String username, String password) {
          //some code
     }
  }

我已声明bec(backendcode对象,以便它对整个类可见)作为welcomepage类中的成员数据并在其construcor中初始化 但是它会在具有一些初始化的construcor中创建,但是对于jButton1ActionPerformed方法中的对象值将为null。为什么...获得该初始化对象实例的解决方案是什么?

4 个答案:

答案 0 :(得分:3)

永远不会初始化全局bec变量。您在构造函数的范围内创建一个新的bec变量。

尝试以下方法:

public class welcomepage extends javax.swing.JFrame {
    backendcode bec;
    String username;
    public welcomepage() {
    initComponents();
            username=null;
            bec= new backendcode("dummy");
    ...

答案 1 :(得分:1)

更改此行

backendcode bec = new backendcode("dummy");

到这一行:

bec = new backendcode("dummy");

如果仔细查看代码,则隐藏全局变量 bec

答案 2 :(得分:1)

在你的构造函数中:

backendcode bec= new backendcode("dummy");

...创建一个新变量。您想要像这样设置现有字段:

bec= new backendcode("dummy");

无论何时指定类型,您都要创建一个新变量,而不是设置现有变量的值。它可能会令人困惑,因为你发现局部变量可以和字段具有相同的名称 - 当它们这样做时,它被称为阴影,它是默认情况下为该方法的其余部分而不是字段引用的局部变量。 / p>

您可以使用this关键字显式引用该字段,而不是本地变量。例如,如果您将构造函数更改为以下内容:

public welcomepage() {
    initComponents();
    username=null;
    backendcode bec= new backendcode("dummy");
    System.out.println("bec created "+ this.bec);
}

...你会看到字段(this.bec)仍为空。

顺便说一下,你应该把这个字段声明为私有 - 这样它对于整个类仍然是可见的(这就是为什么它是一个字段)但是不会从任何其他可见(或更重要的是,可更改) 类。如果你确实需要其他类来改变字段的状态,那么你可以通过getter / setter方法以更加可控的方式做到这一点。

答案 3 :(得分:0)

您正在使用此行隐藏字段。

backendcode bec= new backendcode("dummy");

应该是

bec= new backendcode("dummy");

您所做的工作称为shadowing

我还建议查找Java naming conventions。它将使您的代码更易于阅读。