2016-06-26 21 views
-5

私はオブジェクト指向の世界を理解するのに苦労しています。私は宿題に取り組んでいます。なぜここでエラーが発生しているのか理解できません。私が持っている問題は、addメソッドです。私はNetbeans IDEを使用しています(教授の要求ごとに)、私が得ている問題はaddメソッドです。両方とも「シンボルを見つけることができません」と言う2つのエラーがあります。一方は変数customersを参照し、他方は変数numCustomerを参照しています。私は間違ってやっていることを理解しようとしています。ただそれを修正する方法だけではありません。Javaでシンボルエラーが見つかりません - なぜですか?

私がこれまで持っているもの:

package homework6; 

/** 
* 
* @author christian 
*/ 

public class Homework6 { 
    // Declare variables 
    private int numCustomers = 0; 
    private Customer customer; 

    // Constructor 
    public Homework6() { 
     Customer[] customers = new Customer[50]; 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public void main(String[] args) { 
     System.out.println("Christian Beckman N00963294"); 
     System.out.println("Homework 6"); 
     System.out.println(); // Prints a blank line 

     // Create and instance of Homework6 
     Homework6 homework6 = new Homework6(); 
     homework6.execute(args); 
    } 

    private void add(Customer customer) { 
     int i = 0; 
     customers[i] = customer; 
     i++; 
     numCustomer++; 
    } 

    private void displayCustomers() { 

    } 

    private void execute(String[] args) { 

    } 

    private int getTotal() { 

    } 

    private void readFile(String filename) { 

    } 
} 
+2

あなたのコンストラクタは 'constructors'という新しい変数を宣言します。それは作成されたフィールドではないので、すぐに破棄されます。おそらくあなたはそれをフィールドとして作ろうとしていたのでしょうか? – Makoto

+0

あなたが何を意味するのか分かりません。 – user43378

答えて

0

あなたの変数は「S」とnumCustomersですが、あなたの方法は「S」なしnumCustomer++;を指します。

それは次のようになります。

numCustomers++; 

private Customer customer; 

のために、それはおそらくする必要があります:あなたは顧客と顧客を参照してくださいどこ

private Customer[] customers; 

はあなたのコードでは非常に注意してください。配列の "customer"というコンベンションと、 "customers"というコンベンションを使用しているようです。それがあまりにも微妙な場合は、oneCustomerやallCustomersのようなものに変更することを検討してください。

+0

それだけではありません。 – Makoto

+0

はい、あなたがコメントしている間、自分の投稿に追加していました。 :) –

+0

'add'メソッドにも' i'は必要ありません。 – 4castle

0

Customerのオブジェクトの配列をコンストラクタに作成すると、すぐに配列が破棄されます。このようにそれを宣言してみてください。

public class Homework6 { 
    // Declare variables 
    private int numCustomers = 0; 
    private int i = 0; 
    private Customer customer; 
    private Customer[] customers; 

    // Constructor 
    public Homework6() { 
     customers = new Customer[50]; 
    } 
... 

この理由は、メソッド内で宣言された変数である(この場合は、コンストラクタは)それだけでそのメソッド内でアクセスすることができることを意味しますローカルスコープと呼ばれるものがあります。メソッドの外で宣言する変数には、グローバルスコープと呼ばれるものがあります。つまり、クラス内のすべてのメソッドで変数にアクセスできます。

上記と同じ理由で、iは、add関数を呼び出すたびに0にリセットされ続けます。これを修正するには、コンストラクタの上にprivate int i = 0を他の変数で宣言します。そして、そのようにメソッドを書く:あなたはaddメソッドでnumCustomer++を行うたびに、最後に「S」とnumCustomersを宣言しているため

private void add(Customer customer) { 
     customers[i] = customer; 
     i++; 
     numCustomers++; 
    } 

また、あなたが上記のようなnumCustomers++を置く必要があります。正確に一致する必要があります。

+0

これで問題は解決しました。なぜ私のコンストラクタの配列が作成され、その後即座に破棄されると言うのか、ちょっと混乱します。私の教授は、あなたが明示的に特定のサイズの配列を作成する方法は....... ArrayType [] nameOfArray = new ArrayType [arraySize]; – user43378

+0

私の変数 "i"のスコープと変数名がnumCostomers ++ではないことがわかりました。あなたの助けてくれてありがとう、もしあなたがそれが何であるかを説明することができれば、私が上で述べたアレイの問題について間違っています。私は非常に感謝します。前もって感謝します。 – user43378

+0

@ user43378変数をグローバル変数またはローカル変数として宣言できます。グローバル変数はクラス全体で使用できますが、ローカル変数は単一のメソッドでしか使用できません。 'Customer [] customers'をコンストラクタの中に入れたので、配列をローカル変数にしました。この配列は、ローカルスコープを持つためコンストラクタでのみ使用できます。上記の例のようなメソッドの外に配列を宣言すると、これはグローバルスコープになります。メソッドの外で宣言したので、クラス全体で使用できます。 –

関連する問題