2012-04-17 14 views
1

私は、Javaにrelativly新たなんだとJavaFXの持つビットをexperimantatingクラスBからメソッドを使用している間、私はクラスAから変数を変更したい使用方法は

メイン:もっぱらこのクラス:メインクラスのthats、それはそのは、実際の「主要被写体」

public class Main extends Application { 
Sub sub = new Sub(); 
int a; 

// stuff 

public void aMethod() { 
sub.subMethod(); 
} 

} 

サブを作成していないので、それは、コンストラクタを持っている(primaryStageなどを示して)必要なすべてのものが含まれています陳に捧げるGE変数a、それは「サブオブジェクト」を作成するためのコンストラクタが含まれていません

public class Sub { 
//stuff 

subMethod(){ 
int a = 5; 
} 

私はサブクラスでラインMain main;を置けば私は場合、プログラムは、私にnullポインタ例外を与えますsubMethod()を呼び出します。 ok ...私は実際には主なオブジェクトを作成していないと思います...これまでのところとても良いです。

しかし...私はラインMain main = new Main();に入れた場合、プログラムが文句を言わないとしても、「アプリケーションの実行中に例外」私はサブメソッドで行Main main = new Main();を置けば、けれどもされたエラー

に私に奇妙なことを与え始めます。 ..

subMethod(){ 
Main main = new Main(); 
int a = 5; 
} 

...こいつが実際に動作します...(メソッドのすべての呼び出しでその新しいオブジェクトを作成するためだけでなく、そのスローは推測)

だから、なぜでしょうか?

どのように正しく行われますか? :) (変数を「上書き」するために、他のクラスのメソッドを使用して)

よろしく レッド

+0

実際には動作しません。あなたが5に設定した番号をコンパイルするのは、 'Main'クラスのものと同じではありません。また、メソッドで使用している 'Main'も、他のものと同じインスタンスではありません。 – twain249

+1

あなたのプログラムの_entire_ソースを提供できますか?今は本当に不明です。 –

答えて

0

あなたは、あなたのプログラムの中でMainの複数のインスタンスを作成しないでください。おそらくMainは、可変状態(クラスのメンバー)を格納するのに最適な場所ではないですが、あなたは、あなたがsubMethodMainのインスタンスを渡す(およびa公開し、またはパブリックsetterメソッドを提供)する必要があることをしたい場合:

public class Main extends Application { 
Sub sub = new Sub(); 
public int a; 

// stuff 

public void aMethod() { 
sub.subMethod(this); 
} 

} 

public class Sub { 
//stuff 

subMethod(Main main){ 
main.a = 5; 
} 
0

他のクラスのフィールドの値を変更するメソッドが必要です。これを行うにはいくつかの方法があります。あなたはこのクラス

public Class A { 
    private int a; 
    ... 

    public void setA(int a) { 
     this.a = a; 
    } 
} 

を持っている場合は、この

public Class B { 
    private static A instance; 

    .... 

    public static void setA(int a) { 
     instance.setA(a); 
    } 
} 

それとも、直接たい場合は、setメソッド

public Class B { 
    ... 

    public static void setA(A a, int val) { 
     a.setA(val); 
    } 
} 

になどのパラメータでAを取ることができますような何かを行うことができますAのフィールドへのアクセスを公開する必要があります(これは通常、他のクラスが必要とするだけのアクセスを与えるのではなく、完全なアクセスを提供するため、あなたがやりたいことではありません)

Public Class A { 
    public int a; 
    ... 
} 

あなたがBinstance

B b = new B(); 
b.setA(a, val); 

のようにそれを呼び出す必要があります staticとしてあなたが B方法 setAを持っていないなら、あなたはまた

Public Class B { 
    ... 
    public static void setVal(A a, int val) { 
     a.a = val; 
    } 
} 

を行うことができます

静的であるかのように、class B

B.setA(a, val);