0

私は現在2つのクラスを持っています。最初のクラスにはarraylistが含まれています。しかし、2番目のクラスでarraylistにアクセスしようとすると、変数が存在しないという赤い線が下に表示され続けます。

こちらが一級...

public class BankMain {


    public static void main(String[] args) {
        // TODO Auto-generated method stub
        BankMain main = new BankMain();

        menu();
    }

    public static void cardNumbers(){
        ArrayList<Integer> cardNum = new ArrayList<Integer>();
        Scanner cards = new Scanner(System.in);
        Scanner input = new Scanner(System.in);
        Scanner keyboard = new Scanner(System.in);

        System.out.println("Please select a 5 digit card number");

        cardNum.add(input.nextInt());

        System.out.println("Thank you! You're card number is " +cardNum);

        System.out.println("Type 'c' to go back to main menu.");
        String value  = keyboard.next();
        if(value.equalsIgnoreCase("c")){
            menu();
        }
        else if (!keyboard.equals('c')){
            System.out.println("Invalid Entry!");
        }
    }

    public static void menu(){
        System.out.println("What Would you like to do today?");
        System.out.println();
        System.out.println("Create Account = 1");
        System.out.println("Login = 2");
        System.out.println("Exit = 3");
        query();
    }

    public static void query(){
        Scanner keyboard = new Scanner(System.in);
        double input = keyboard.nextInt();  

        if (input == 2){
            BankMainPart2 main2 = new BankMainPart2();
            System.out.println("Please enter your 5 digit card number.");
            main2.loginCard();
        }
        else if (input == 1){
            cardNumbers();
        }
        else if (input == 3){
            System.out.println("Thank you, have a nice day!");
            System.exit(0);
        }
    }
}

こちらは2級...

public class BankMainPart2 {
    public static void loginCard(){
        if (cardNum.contains(name)) {
        }
    }
}

2 番目のクラスの if ステートメントにまだ何も入力していないことはわかっていますが、配列リストを両方のクラスで機能させようとしています。

4

5 に答える 5

0

メソッドにBankMainPart2.loginCardは「cardNum」のコンテキストがありません。それが何であるか(タイプまたは値)がわかりません。

メソッドが配列リストで動作できるようにするには、次のような参照を渡す必要があります...

public class BankMainPart2 {
    public static void loginCard(ArrayList<Integer> cardNum){
        if (cardNum.contains(name)) {
        }
    }
}
于 2012-09-21T05:39:43.967 に答える
0

Cardnum arraylist を BankMain クラスのインスタンス変数として作成し、BankMainClass2 で BankMain を拡張し、BankMain の参照を使用して、このように cardNum にアクセスできます

Class BankMain {
  public ArrayList<String> cardNum = new ArrayList<String>();

 }
 Class BankMain2 extends BankMain {
    public void method() {
  BankMain2 main = new BankMain2();
      sysout(main.cardNum.size());
      }
 }

ただし、上記のシナリオは、BankMain クラスの cardNum ArrayList が public、protected、または default(Nomodifier) とマークされている場合にのみ機能します。プライベートおよび static や final などの他の非アクセス修飾子としてマークされている場合は機能しません

于 2012-09-21T05:44:55.643 に答える
0

これらのいずれかを試すことができます

1. Arraylist を public として宣言し、最初のクラスをインポートして、2 番目のクラスで cardNum を使用します。

2. cardNum を static var にし、2 番目のクラスで BankMain.cardNum として直接使用します。

3.Arraylist を引数として 2 番目のクラスに渡します。

于 2012-09-21T05:48:35.373 に答える
0

重要な問題は、クラスを作成しようとしている方法にあります。現在の問題は、@ MadProgrammer からの回答で解決できます。ただし、オブジェクト指向プログラミングの概念を確認する必要があります。このセクションでHow to identify and design a Class?は、いくつかの明確な指針を示します。

于 2012-09-21T05:48:42.220 に答える
0

コードは非常に素朴に見えます。あなたの質問に対する非常に簡単な答えは

BankMainPart2 で cardNum をグローバル変数として、または loginCard でローカル変数として宣言していませんが、loginCard メソッドでどのように使用できると思いますか?

ArrayList<Integer> cardNum = new ArrayList<Integer>();

cardNumbers メソッドに対してローカルです。

他のクラスからどのようにアクセスできますか?

  1. ローカル変数はメソッドの外からアクセスできないので、まずは cardNum クラスレベルの変数にしてください
  2. 他のクラスが変数に直接アクセスできるようにする場合は、変数を public にします。それ以外の場合は、変数を private にして getter メソッド (必要に応じて setter) を作成します。
  3. メソッドを引数として呼び出すときに変数を送信することもできます
  4. これがクラス レベルの変数である場合は、静的にして Classname.variable を使用します。

- 編集 -

詳細を求められたので、さまざまなアプローチの概要を簡単に説明します。

  1. メソッド内で宣言された変数はローカルです。名前が示すように、「ローカル」とは、そのような変数があることをメソッド以外の誰も知らないことです。クラス内の他のメソッドは、この変数の存在を知りません。外部クラスは言うまでもありません。
  2. 静的にすることもできますが、静的はオブジェクト レベルではなく、クラス レベルのストレージに厳密に使用する必要があります。同じクラスの複数のオブジェクトによって変更されたリストを言ってください (オブジェクトの概念を知っていることを願っています。あなたの例によると、これはあなたが望むものではないと思います。
  3. public 変数は一般に no - no です。ごくわずかな場合にのみ役立ちます (たとえば、パフォーマンスが最も重要な Android プログラミングなど)。通常、変数を作成し、ゲッター セッターを提供します。変数へのアクセスを許可したい場合は通常、ゲッターまたはセッターが使用されますが、これもまた、あなたが望んでいるようには見えません。
  4. 最後に、変数はクラスに対してプライベートですが、メソッドに何かをさせたい場合は、それを引数として渡すことができます。これはあなたの場合です。

一歩一歩

メソッドから変数を取り出し、クラス レベルに追加します。メソッド名から static を削除したことに注意してください

public class BankMain {
private ArrayList<Integer> cardNum = new ArrayList<Integer>();
// rest of code as it is 
..
..
 BankMain main = new BankMain();
 //change
    main.menu();

 //no need foe static
  public void cardNumbers(){
//no need here now        
//ArrayList<Integer> cardNum = new ArrayList<Integer>();
        Scanner cards = new Scanner(System.in);
        Scanner input = new Scanner(System.in);
..
..

//public static void menu(){
  public void menu(){


//send the list
 //I see there are confusion at times regarding calling of static method.
 //please note objectname.staticMethod() or classname.staticMethod() is one 
 //and same thing. Just that classname.staticMethod() is more clear 
 BankMainPart2.loginCard(cardNum);

}

public class BankMainPart2 {
    public static void loginCard(ArrayList<Integer> cardNum){
        if (cardNum.contains(name)) {
        }
    }
}
于 2012-09-21T05:39:10.893 に答える