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(クラス全体に表示されるようにバックエンドコードオブジェクト)を宣言し、その構造で初期化されましたが、いくつかの初期化によってその構造内で作成されますが、jButton1ActionPerformedメソッド内のbecオブジェクトの値はnullになります。なぜそれは..その初期化されたオブジェクトインスタンスを取得するための解決策は何ですか?

4

4 に答える 4

3

グローバルbec変数が初期化されることはありません。becコンストラクターのスコープで新しい変数を作成します。

次のことを試してください。

public class welcomepage extends javax.swing.JFrame {
    backendcode bec;
    String username;
    public welcomepage() {
    initComponents();
            username=null;
            bec= new backendcode("dummy");
    ...
于 2012-09-19T14:40:23.480 に答える
1

この行を変更します

backendcode bec = new backendcode("dummy");

この行に:

bec = new backendcode("dummy");

コードを注意深く見ると、グローバル変数becを非表示にしています。

于 2012-09-19T14:38:59.593 に答える
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...フィールド( )がまだnullであることがわかります。

ちなみに、フィールドをプライベートとして宣言する必要があります。そうすれば、クラス全体に表示されますが(そのため、フィールドになります)、他のクラスからは表示されません(さらに重要なことに、変更可能になります)。フィールドの状態を変更するために他のクラスが必要な場合は、getter/setterメソッドを使用してより制御された方法でそれを行うことができます。

于 2012-09-19T14:39:52.737 に答える
0

コンストラクターでこの行を使用してフィールドを非表示にしています。

backendcode bec= new backendcode("dummy");

そのはず

bec= new backendcode("dummy");

あなたがしたことはシャドウイングと呼ばれています

また、 Javaの命名規則を調べることをお勧めします。コードが読みやすくなります。

于 2012-09-19T14:39:40.073 に答える