-1

私のクラス B では、クラス A のメソッドを使用できるようにしたいと考えています。これが私が試したことです。

  1. 輸入クラスA
  2. 初期化 - classA a = new classA(null, null);
  3. クラスAメソッドを使用したいメソッドに追加

    public void getAMethod() { a.getTestValue; }

私の質問は次のとおりです。

  1. これは正しい方法ですか?
  2. クラス B を実行するたびに、常にクラス A の新しいインスタンスが作成されますか?
  3. クラス A を開いてクラス B を実行すると、クラス B はクラス A の変数の現在の値を取得しますか、それとも新しいクラス A(null, null) のためにクラス A のデフォルト値を取得しますか?

私の問題は次のとおりです。

  1. 同じ変数に対して 2 つの異なる値を取得しています。

例:クラスA -

initialize = boolean test = false

クラス A ダイアログが開いたら、test = true を設定します。

メソッドの作成

public boolean getTestValue() {
   return test;
}

クラス A 内から getTestValue を実行すると、常に true になります クラス B から getTestValue が呼び出されると、常に false が返されます (クラス A ダイアログが開いていても)

クラスbが毎回クラスAの新しいインスタンスを作成しているように見えるため、クラスAのデフォルト値のみが表示されます.クラスBがクラスAを呼び出すとき、デフォルトではなくクラスAの現在の値を取得する必要があります

EDIT クラスAのメソッドを静的に変更し、問題を修正しました。これは私にとって大きな助けになりました - 提案してくれてありがとう!

4

3 に答える 3

2

かなりの量の説明が必要ですが、簡潔にまとめて、各質問に順番に答えるようにします。

1. これは正しい方法ですか?

通常、小さなプログラムではクラスをインポートする必要はありません。ClassAClassBが同じパッケージ内にある場合、または両方にパッケージが割り当てられていないが、同じディレクトリにある場合、インポートは必要ありません。

ClassAメソッドでメソッドをラップする限りClassB、いいえ、いいえ。次のようにして、いつでも内部からClassA 静的メソッドにアクセスできます。ClassB

ClassA.myMethodInClassA();

が静的でない場合myMethodInClassA();は、(まだ ClassB にある) soのインスタンスで呼び出す必要があります。ClassA

ClassA myA = new ClassA();
myA.myMethodInClassA();

staticそれが私をvsnon staticフィールドに連れて行きます。フィールドinitializetestが次のようにマークされている場合static

public static boolean initialize = false;

次に、すべてのインスタンスで常に同じ値を持ち、どこからでもアクセスできます。ClassA

if(ClassA.initialize) {
    //something
}

それらが静的としてマークされていない場合、再び(非静的メソッドと同様に)次のようなフィールドを照会するためのインスタンスが必要です。ClassA

ClassA myA = new ClassA();
if(myA.initialize) {
    //something
}

この場合、 の各インスタンスClassAは の独自のコピーがinitializeあるため、 の値initializeは照会するインスタンスによって異なります。

2. クラス B を実行するたびに、常にクラス A の新しいインスタンスが作成されますか?

ClassAfor コンストラクターの内部でfor コンストラクターを呼び出す場合ClassB、答えはイエスです。

public ClassB() {
    //constructor for ClassB
    ClassA c = new ClassA();
}

はい、新しい を作成するClassA たびに新しいを作成しますClassB

3. クラス A を開いてクラス B を実行した場合、クラス B はクラス A の変数の現在の値を取得しますか、それとも新しいクラス A(null, null) のためにクラス A のデフォルト値を取得しますか?

「開いた」とは、コマンドプロンプトでjava ClassA実行してから実行したことを意味する場合、2 つの別個のプログラムがあり、JVM の 2 つのインスタンスが並行して実行されています。これら 2 つのプログラムは互いに何の関係もありません。特に何かを実装しない限りjava ClassB互いに通信することはできません。

「開かれた」とは、構築されたものを意味する場合、new ClassA();クラスとインスタンスのメンバーについて再び話している.

static質問 1 への回答で、 vsnon-staticフィールドとメソッドについて怒鳴りつけました。全体として、次のようなドキュメントを読むことをお勧めします。

http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

TLDR: このリンクを読んでください ^^

于 2012-10-17T16:40:31.670 に答える
1

@Jkteaterとして、コードスニペットであなたの質問をサポートしていませんでしたが、あなたの質問に従って

Is this the correct way to do it ?

回答:2つの方法を介して他のクラスでクラスAのメソッドを使用できますクラスAをクラスBに拡張します(クラスBはクラスAを拡張します)。

Is every time I execute class B, is it always creating a new instance of class A?

回答:クラスAの新しいインスタンスを作成したくない場合は、クラスBでクラスAを拡張するか、クラスAでメソッドを静的にします。静的な場合は、クラス名のみで使用します(A.getTestValue();)

If class A is opened and I run class B, does class B get the current
  values of variables in class A, or does it get the class A defaults
   because of new classA(null, null)

Ans:classA a=new classA(null,null);このクラス(null,null)は、クラスAの非静的データメンバーを初期化するために使用されるコンストラクターであり、クラスBの現在の値とは何の違いもありません。 u はこのコンストラクターを通過します。これにより、クラス A の非静的データ メンバーが初期化されます。

以下の質問について、正確なコードを貼り付けてください。正確な回答を得ることができます..

于 2012-10-17T16:54:46.677 に答える
0

A の新しいインスタンスを作成しているため、変数 test を static にします。値は異なります

これは正しい方法ですか?
それは詳細なユースケースに依存します

クラスBを実行するたびに、常にクラスAの新しいインスタンスを作成していますか?
はい、B のインスタンスを作成するたびに、A の新しいインスタンスが作成されます。

クラス A を開いてクラス B を実行すると、クラス B はクラス A の変数の現在の値を取得しますか、それともクラス A のデフォルト値を取得しますかnew classA(null, null) のため?
新しいインスタンスを作成しているため、デフォルト値が取得されます

于 2012-10-17T16:33:17.770 に答える