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

Java 如何在两个不同的类上使用一个数组,java,arraylist,Java,Arraylist,我现在有两个类,第一个类中有arraylist。但是在第二个类中,当我试图访问arraylist时,它一直给我下面的红线,表示变量不存在 这是一班 public class BankMain { public static void main(String[] args) { // TODO Auto-generated method stub BankMain main = new BankMain(); menu(); }

我现在有两个类,第一个类中有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);
        }
    }
}

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

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

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

ArrayList<Integer> cardNum = new ArrayList<Integer>();
ArrayList cardNum=new ArrayList();
是CardNumber方法的局部

如何从其他类访问它

  • 无法从方法外部访问局部变量,因此首先要使cardNum类成为级别变量
  • 如果希望其他类能够直接访问该变量,则将该变量设为公共变量,否则将该变量设为私有变量并创建getter方法(如果需要,设为setter)
  • 也可以在将方法作为参数调用时发送变量
  • 如果这是类级变量,则将其设为静态并使用Classname.variable
  • --编辑--

    由于您要求了解详细信息,请允许我快速概述不同的方法

  • 方法中声明的变量是局部变量。顾名思义,只有方法知道存在这样一个变量。类中没有其他方法知道这个变量的存在,更不用说类外的一些方法了
  • 我说可以将其设置为静态,但静态应该严格用于类级存储,而不是对象级存储。假设一个列表被同一类的多个对象修改(我希望您知道对象的概念,否则就转到基础,否则它将不清楚)。根据你的例子,我想这不是你想要的
  • 公共变量通常是no-no,只有在少数情况下才有用(例如在性能最重要的android编程中)。通常我们将创建一个变量并提供getter setter。当我们想要访问变量时,通常会使用getter或setter,而变量看起来又不像您想要的
  • 最后,这个变量对类是私有的,但是如果您想让某个方法对它做些什么,您可以将它作为参数传递,这看起来很适合您
  • 一步一步

    从方法中取出变量并添加到类级别,注意我从方法名称中删除了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);
    
    }
    
    公共类BankMain{
    private ArrayList cardNum=new ArrayList();
    //代码的其余部分保持原样
    ..
    ..
    BankMain main=新的BankMain();
    //改变
    main.menu();
    //不需要静电
    公共卡号码(){
    //现在不需要了
    //ArrayList cardNum=新的ArrayList();
    扫描仪卡=新扫描仪(System.in);
    扫描仪输入=新扫描仪(System.in);
    ..
    ..
    //公共静态无效菜单(){
    公共无效菜单(){
    //发送列表
    //我看到在调用静态方法时有时会出现混乱。
    //请注意objectname.staticMethod()或classname.staticMethod()就是其中之一
    //同样,只是classname.staticMethod()更清晰
    BankMainPart2.登录卡(cardNum);
    }
    

    公共类BankMainPart2{
    公共静态无效登录卡(ArrayList cardNum){
    if(cardNum.contains(name)){
    }
    }
    }
    
    您的方法,
    BankMainPart2.loginCard
    没有“cardNum”的上下文,它不知道它是什么(类型或值)

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

    public class BankMainPart2 {
        public static void loginCard(ArrayList<Integer> cardNum){
            if (cardNum.contains(name)) {
            }
        }
    }
    
    公共类BankMainPart2{
    公共静态无效登录卡(ArrayList cardNum){
    if(cardNum.contains(name)){
    }
    }
    }
    
    将cardnum arraylist作为BankMain类中的实例变量,并在BankMain类2中扩展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类{
    public ArrayList cardNum=new ArrayList();
    }
    BankMain2类扩展了BankMain{
    公开作废法(){
    BankMain2 main=新的BankMain2();
    sysout(main.cardNum.size());
    }
    }
    

    但上述场景仅在BankMain类中的cardNum ArrayList标记为public、protected或default(Nomodifier)时才起作用。如果其标记为private和其他非访问修饰符(如static和final),则不起作用。您可以尝试其中任何一种

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

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


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

    关键问题在于您尝试创建类的方式。您当前的问题可以通过@MadProgrammer给出的答案来解决。但您应该明确了解面向对象编程的概念。本节将为您提供一些明确的指示。

    你到底想做什么?cardNum将是第一个类的私有类。单独的类不应该共享那样的内部数据。你需要再次检查OOP。我只是想在另一个类上放置更多的方法来拆分它们,我想将我的银行帐户登录方法放在单独的类中,但是当使用第二个类时,我会在第一个类中读取arraylist以检查arraylist中是否存在pin码。我正在构建一个ATM程序。@MattMcCarthy
    Bank
    是一种容器,在您的情况下,我会说,是一个“帐户”容器.
    Bank
    应负责对试图访问任何帐户的任何用户进行身份验证,因为它是守门员,负责允许访问帐户。类似于
    Bank.getAccount(UserCredentials,accountNumber)
    
    public class BankMainPart2 {
        public static void loginCard(ArrayList<Integer> cardNum){
            if (cardNum.contains(name)) {
            }
        }
    }
    
    Class BankMain {
      public ArrayList<String> cardNum = new ArrayList<String>();
    
     }
     Class BankMain2 extends BankMain {
        public void method() {
      BankMain2 main = new BankMain2();
          sysout(main.cardNum.size());
          }
     }