2012-09-19 41 views
0
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 初始化,但它得到了一些intialisations是construcor内创建,但因为jButton1ActionPerformed方法内的对象的值将为null。为什么它是..什么是解决方案,以获得初始化对象实例?不当对象创建Java中

+3

我没有动力来回答一个问题,如果它没有被录取的机会......嗯,通常不会...叹息 – ZnArK

回答

3

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

尝试以下操作:

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

改变这一行

backendcode bec = new backendcode("dummy");

这一行:

bec = new backendcode("dummy"); 

你是隐藏的全局变量BEC,如果你在你的代码仔细看。

0

你在这个网站上隐藏着这条线。

backendcode bec= new backendcode("dummy"); 

应该

bec= new backendcode("dummy"); 

您所做的一切被称为shadowing

我也建议仰视Java naming conventions。它会让你的代码更易于阅读。

1

在你的构造函数,你正在做的:

backendcode bec= new backendcode("dummy"); 

...这将创建一个新的变量。你要设置的现有场这样的:

bec= new backendcode("dummy"); 

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

您可以通过使用this关键字明确引用该字段,而不是本地变量。举例来说,如果你改变了你的构造函数如下:

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

...你会看到领域(this.bec)仍然是零。

顺便说一句,你应该申报现场为私有 - 这样,它仍然是可见的整个类(这就是为什么它是一个场),但将不可见(或更重要的是,改变的)任何其他类。如果您确实需要其他类来更改字段的状态,那么您可以通过getter/setter方法以更受控制的方式来执行此操作。