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。为什么...获得该初始化对象实例的解决方案是什么?
答案 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。它将使您的代码更易于阅读。