0

我现在有 2 个类,第一个类中有 arraylist。但是在第二堂课上,当我尝试访问 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);
        }
    }
}

这里是二等...

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

我知道我还没有在第二类的 if 语句中输入任何内容,但我只是想让我的数组列表在这两个类上都起作用。

4

5 回答 5

0

代码看起来很幼稚。您的问题的一个非常简单的答案是

您尚未在 BankMainPart2 中将任何 cardNum 声明为全局变量或在 loginCard 中声明为局部变量,您认为它如何在 loginCard 方法中可用?

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

对 cardNumbers 方法来说是本地的。

你怎么能从其他类访问它?

  1. 不能从方法外部访问局部变量,所以首先,使 cardNum 类级别变量
  2. 如果您希望其他类能够直接访问它,请将变量设为 public,否则将变量设为私有并创建 getter 方法(如果需要,设置为 setter)。
  3. 您也可以在将方法作为参数调用时发送变量
  4. 如果这是类级别变量,请将其设为静态并使用 Classname.variable。

- 编辑 -

正如您所要求的详细信息,让我快速概述一下不同的方法。

  1. 在方法中声明的变量是局部变量。顾名思义,“本地”,除了方法之外没有人知道有这样一个变量。类中没有其他方法知道此变量的存在,更不用说某些外部类了。
  2. 我说您可以将其设为静态,但静态应严格用于类级别存储,而不是对象级别。说一个由同一类的多个对象修改的列表(我希望您了解对象的概念,否则请转到基础知识,否则将不清楚)。现在根据您的示例,我想这不是您想要的。
  3. 公共变量通常是 no - no,只有在少数情况下它才会有用(例如在性能最重要的 android 编程中)。通常我们会创建一个变量并提供getter setter。当我们想要授予对变量的访问权限时,通常会使用 getter 或 setter,这又不像您想要的那样。
  4. 最后,变量对你的类来说是私有的,但是如果你想要一些方法来处理它,你可以将它作为参数传递,这看起来适合你。

一步步

从方法中取出变量并添加到类级别,注意我从方法名称中删除了静态

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 回答
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 数组列表作为 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 标记为公共、受保护或默认(Nomodifier)时才有效。如果将其标记为私有和其他非访问修饰符(例如静态和最终),它将不起作用

于 2012-09-21T05:44:55.643 回答
0

您可以尝试其中任何一种

1.将Arraylist声明为public,然后导入第一个类,在第二个类中使用cardNum

2.将cardNum设为静态变量,直接在第二类中作为BankMain.cardNum使用

3.将 Arraylist 作为参数传递给第二个类。

于 2012-09-21T05:48:35.373 回答
0

关键问题在于您尝试创建类的方式。您当前的问题可以通过@MadProgrammer 给出的答案来解决。但是你绝对应该看看面向对象的编程概念。本节How to identify and design a Class?应该给你一些明确的指示。

于 2012-09-21T05:48:42.220 回答