java中不正确的对象创建
我在welcomepage类中声明了bec(后端代码对象,以便整个类都能看到它)作为成员数据,并在其构造函数中进行了初始化 但它是在construcor内部通过一些初始化创建的,但jButton1ActionPerformed方法中的bec对象值将为null。为什么。。获得初始化对象实例的解决方案是什么 更改此行java中不正确的对象创建,java,swing,Java,Swing,我在welcomepage类中声明了bec(后端代码对象,以便整个类都能看到它)作为成员数据,并在其构造函数中进行了初始化 但它是在construcor内部通过一些初始化创建的,但jButton1ActionPerformed方法中的bec对象值将为null。为什么。。获得初始化对象实例的解决方案是什么 更改此行 backendcode bec=新的后端代码(“虚拟”) 关于这一行: public class welcomepage extends javax.swing.JFrame {
backendcode bec=新的后端代码(“虚拟”)代码>
关于这一行:
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 bec=新的后端代码(“虚拟”)代码>
关于这一行:
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。您将在构造函数中隐藏带有此行的字段
bec = new backendcode("dummy");
应该是
backendcode bec= new backendcode("dummy");
你所做的事叫做
我还建议你向上看。这将使您的代码更易于阅读。您在构造函数中隐藏了带有此行的字段
bec = new backendcode("dummy");
应该是
backendcode bec= new backendcode("dummy");
你所做的事叫做
我还建议你向上看。这将使您的代码更易于阅读。在构造函数中,您正在执行以下操作:
bec= new backendcode("dummy");
…这将创建一个新变量。您希望按如下方式设置现有字段:
backendcode bec= new backendcode("dummy");
无论何时指定类型,都是在创建新变量,而不是设置现有变量的值。这可能会让人困惑,因为正如您所发现的,局部变量可能与字段具有相同的名称-当它们具有相同的名称时,它被称为阴影,并且该方法的其余部分默认引用的是局部变量,而不是字段
通过使用this
关键字,可以显式引用字段,而不是局部变量。例如,如果将构造函数更改为以下内容:
bec= new backendcode("dummy");
public welcomepage() {
initComponents();
username=null;
backendcode bec= new backendcode("dummy");
System.out.println("bec created "+ this.bec);
}
…您将看到字段(this.bec
)仍然为空
顺便说一句,您可能应该将该字段声明为private,这样它对整个类仍然可见(这就是为什么它是一个字段),但对任何其他类都不可见(或者更重要的是,不可更改)。如果确实需要其他类来更改字段的状态,则可以通过getter/setter方法以更可控的方式进行更改。在构造函数中,您正在执行以下操作:
bec= new backendcode("dummy");
…这将创建一个新变量。您希望按如下方式设置现有字段:
backendcode bec= new backendcode("dummy");
无论何时指定类型,都是在创建新变量,而不是设置现有变量的值。这可能会让人困惑,因为正如您所发现的,局部变量可能与字段具有相同的名称-当它们具有相同的名称时,它被称为阴影,并且该方法的其余部分默认引用的是局部变量,而不是字段
通过使用this
关键字,可以显式引用字段,而不是局部变量。例如,如果将构造函数更改为以下内容:
bec= new backendcode("dummy");
public welcomepage() {
initComponents();
username=null;
backendcode bec= new backendcode("dummy");
System.out.println("bec created "+ this.bec);
}
…您将看到字段(this.bec
)仍然为空
顺便说一句,您可能应该将该字段声明为private,这样它对整个类仍然可见(这就是为什么它是一个字段),但对任何其他类都不可见(或者更重要的是,不可更改)。如果确实需要其他类来更改字段的状态,则可以通过getter/setter方法以更可控的方式进行更改。全局bec
变量永远不会初始化。在构造函数的作用域中创建一个新的bec
变量
请尝试以下操作:
bec= new backendcode("dummy");
public welcomepage() {
initComponents();
username=null;
backendcode bec= new backendcode("dummy");
System.out.println("bec created "+ this.bec);
}
全局bec
变量从未初始化。在构造函数的作用域中创建一个新的bec
变量
请尝试以下操作:
bec= new backendcode("dummy");
public welcomepage() {
initComponents();
username=null;
backendcode bec= new backendcode("dummy");
System.out.println("bec created "+ this.bec);
}
如果一个问题没有被接受的机会,我就没有动力去回答它。。。嗯,通常不。。。如果一个问题没有被接受的机会,我就没有动力去回答。。。嗯,通常不。。。叹息