2010-11-28 17 views
0

JavaのIm初心者と私はそれを学んでいます。Javaコンストラクタ関数初心者質問

今私は2つのクラスを持って、私はすでに

class A 
public A { 
init(); 
B bb = new B(textField); 
bb.doSomething(); 
} 

void init() { 
    textField = new JTextField(); 
} 

void fly() { 
//can i just use bb.doFly(); 
} 

private JTextField textField; 
} 

コンストラクタクラスにクラスBと呼ばれる私の質問は、私がAで使用したいすべての単一の機能にB bb = new B();を初期化しなければならないのですか?

質問全ての範囲について

+0

Bのコードを表示する必要があります - doFly()メソッドを持っていますかAから継承していますか? –

答えて

1

その編集されました。属性がクラスレベルの場合、毎回新しい属性を作成する必要はありません。 属性がメソッドスコープ内でのみ作成された場合は、それを行います。

public class A { 
    private B bb = new B; 

    public A() { 

    } 

    public void foo() { 
     bb.printHello(); // you can only call methods on bb which class B supplies 
     bb.fly();  // won't work; you can only call fly() on objects of type A 
    } 

    public void bar() { 
     bb.printWorld();  
    } 

    public void fly() { 
     System.out.println("I'm flying..."); 
    } 
} 

public class B { 
    public B() { 

    } 

    public printHello() { 
     System.out.println("Hello"); 
    } 

    public printWorld() { 
     System.out.println("Hello"); 
    } 
} 

ジャスト注:すべての属性を宣言してください

違いは

​​

クラスレベルのスコープはありません、ただ識別子bbを参照してください

class A { 

    // this is at class level scope. It is define OUTSIDE a method 
    B bb = new B(); 

    public A() { 

    } 
} 
+0

私はこれを以前にしましたが、 "Illegal Forward Reference"というエラーがありました – SOer

0

ですあなたがしなければならない正当な理由がない限り、private

+0

私は質問を更新しました – SOer

0

class A
B bb;
public A {
bb = new B();
bb.doSomething();
}

void fly() {
bb.something()
}
}

0

号は、あなたがこのコードにこのコードがあるとします。

public class NameOfProgram 
{ 
    public static void main(String[] args) 
    { 
     A aa = new A(); 
     aa.fly(); 
    } 
} 

その後AA内部変数BBは声明new A()で作成されます。したがって、Bオブジェクトを作成して、既に存在するようにbbに設定する必要はありません。

また、変数をコンストラクタの外に宣言する必要があります。そうしないと、flyなどの他のメソッドで変数を使用できなくなります。また

public class A 
{ 

    B bb; <----------------- 

    public A() 
    { 
     bb = new B(NameOfVariableIForgotAbout); 
    } 

    public void fly() 
    { 
     bb.doFly() //Now this should work 
    } 
} 

することができますが、メソッドの後B bb;は、私はちょうどそれをこのように好む:それを修正するには、あなたがこれを行うことができます。

また、クラスAにはいくつかのエラーがあります。あなたは、あなたがそのような方法を公開する必要があるクラス(A aa = new A(); aa.fly())のインスタンスからメソッドを呼び出すことができるようにしたい場合はまず、:

public void fly() 
{ 
    //Insert code here 
} 

はまた、あなたは間違ってコンストラクタを宣言しました。

public A 
{ 
    //Insert code here 
} 

、それは次のように行われます:ここではあなたがそれをやった方法です

public A() 
{ 
    //Insert code here 
} 

それはプライベートでももないので、あなたが呼び出しaa.fly()を行う場合、最初のエラーはコンパイル時にエラーが発生しますパブリック。

メソッドを呼び出さなくても、2番目のエラーはコンパイル時に発生します。