如何在2个不同的类上使用一个数组

时间:2012-09-21 05:30:22

标签: java arraylist

我现在有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语句中输入任何内容,但我只是想让我的数组列表适用于这两个类。

5 个答案:

答案 0 :(得分:0)

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

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

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

是cardNumbers方法的本地。

如何从其他课程中访问它?

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

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

    1. 在方法内声明的变量是本地的。正如名字所暗示的那样“本地”,除了方法之外没有人知道有这样的变量。类中没有其他方法知道这个变量的存在,更不用说一些外部类了。
    2. 我说你可以使它静态,但静态应严格用于类级存储,而不是对象级别。说一个由同一个类的多个对象修改的列表(我希望你知道对象的概念,否则转到基础知识,否则它将不清楚)。现在按照你的例子,我猜这不是你想要的。
    3. 公共变量通常不是 - 不,只有在少数情况下它才有用(例如在性能最重要的android编程中)。通常我们会创建一个变量并提供getter setter。当我们想要提供对变量的访问时,通常会使用getter或setter,这看起来也不像你想要的那样。
    4. 最后,变量对你来说是私有的,但是如果你想要一些方法对它做一些事情,你可以将它作为参数传递,这就是你的情况。
    5. 一步一步

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

      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)) {
              }
          }
      }
      

答案 1 :(得分:0)

您的方法BankMainPart2.loginCard没有“cardNum”的上下文,它不知道它是什么(类型或值)。

为了使该方法能够对数组列表起作用,您必须传递对它的引用,例如......

public class BankMainPart2 {
    public static void loginCard(ArrayList<Integer> cardNum){
        if (cardNum.contains(name)) {
        }
    }
}

答案 2 :(得分: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)时才有效。如果它标记为私有和其他非访问修饰符,如静态和最终

,它将无法工作

答案 3 :(得分:0)

您可以尝试其中任何一种

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

2.使cardNum成为静态var并直接在第二类中使用它作为BankMain.cardNum

3.将Arraylist作为第二类的参数。

答案 4 :(得分:0)

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