0
public class MainMDI extends javax.swing.JFrame {

   private static MainMDI thiz; 

      public MainMDI() {
        initComponents();
        thiz = this;
      }
}  

Swing で MDI アプリケーションを作成しています。クラス MainMDI はアプリケーションのメイン クラスであるため、メイン メソッドはそのクラスに存在します。上記のコードは、アプリケーションの実行時に MainMDI クラスのインスタンスを指す thiz という名前の静的変数を作成します。

変数 thiz を使用して、メイン メソッド内からクラス MainMDI の非静的 (インスタンス) メンバーにアクセスすることを計画しています (メイン メソッドはクラス内の静的メンバーであるため、メイン メソッド内から非静的メンバーにアクセスすることはできません)。アプリケーションの MainMDI)。

public class MainMDI extends javax.swing.JFrame {

   private static MainMDI thiz = this; 

      public MainMDI() {
        initComponents();
      }
}  

しかし、上記のコードのように変数 thiz を初期化しようとすると、コンパイラは非静的変数 this は静的コンテキストから参照できないと言います。しかし、私はこれを静的な文脈で言及しているのではありませんか? これは、変数 this が非静的であるため、静的変数 this が初期化されるときにまだ初期化されていないためですか?

また、クラス MainMDI をメイン クラスとして設定せずに、メイン メソッドを含む別のクラスを作成し、そのクラスをメイン クラスとして設定した方が、より良いプログラミング プラクティスになるでしょうか?

4

2 に答える 2

5

しかし、上記のコードのように変数 thiz を初期化しようとすると、コンパイラは非静的変数 this は静的コンテキストから参照できないと言います。しかし、私はこれを静的な文脈で言及しているのではありませんか?

はい、そうです。静的クラス変数は、クラスのロード時に初期化されます (オブジェクト インスタンスの作成時ではありません)。thisその文脈ではありません。コード:

private static javax.swing.JFrame thiz = this; 

単に機能しません。反対の主張にもかかわらず、シングルトンが必要です。それ以外の場合、オブジェクトの N 個の可能なオブジェクト インスタンスが与えられた場合、MainMDI静的コンテキストからどのインスタンスにアクセスすると予想されますか? Java 言語のセマンティクスを強化しようとするのではなく、コードのリファクタリングを検討する必要があります。

于 2013-03-12T07:37:32.767 に答える
3

this「現在操作されているオブジェクトインスタンス」を意味し、非静的メンバー関数内でのみ意味があります。一般thisに、メンバー関数を呼び出すと、各非静的メンバー関数に暗黙的に渡されるため、非静的メンバー関数が呼び出される直前に初期化されると言っても過言ではありません。

「メイン」メソッドを使用してクラスを除外することが適切かどうかは、実際の実装の詳細に大きく依存します。

于 2013-03-12T07:26:13.810 に答える