2012-09-21 25 views
0

我現在有2個類,第一個類中包含數組列表。但在第二課時,當我嘗試訪問數組列表時,它不斷給我下面的紅線,表示該變量不存在。如何在兩個不同的類上使用一個數組

這裏是一個類...

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語句還但我只是想讓我的數組列表在兩個類上工作。

+0

你究竟想要做什麼? cardNum將會是第一類的私人。單獨的課程不應該共享像這樣的內部數據。 –

+3

你需要再次通過OOP。 – elyashiv

+0

我只是想把更多的方法放在另一個類中來分解它們,我想把我的銀行帳戶登錄方法放在一個單獨的類中,但是當使用第二個類時,我希望它能夠讀取數組列表在第一類中檢查pin編號是否存在於arraylist中。我正在建立一個ATM程序。 –

回答

0

該代碼看起來很幼稚。一個非常簡單的回答是你的問題是

你還沒有在BankMainPart2中聲明任何cardNum作爲全局變量,或者在loginCard中聲明爲局部變量,你認爲它會在loginCard方法中可用嗎?

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

是cardNumbers方法的本地方法。

如何從其他課程訪問它?

  1. 的局部變量不能從方法外部訪問,所以第一件事情,讓cardnum中一流水平的變量
  2. 做,如果你想其他類能夠直接訪問它的變量公衆,否則把這些變量私人並創建getter方法(如果需要,setter)。
  3. 您也可以在調用方法時將變量作爲參數發送變量
  4. 如果這是類級變量,請將其設置爲static並使用Classname.variable。

- 編輯 -

正如您所要求的細節讓我給你的不同方法的簡要概述。

  1. 在方法中聲明的變量是本地的。顧名思義「本地」,除了方法之外沒有人知道存在這樣的變量。沒有其他方法知道這個變量的存在,更不用說一些外部類。
  2. 我說你可以使它成爲靜態的,但靜態應嚴格用於類級存儲,而不是對象級別。說一個由同一類的多個對象修改的列表(我希望你知道對象的概念,否則去基礎知識,否則將不清楚)。現在按照你的例子,我想這不是你想要的。
  3. 公共變量通常不是 - 不,只有在少數情況下才會有用(例如在性能最重要的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)) { 
     } 
    } 
} 
+0

多數民衆贊成我所問,我是新來的Java,我不知道如何做到這一點 –

+0

看到我的編輯,讓我知道如果你需要詳細信息 – Kamal

+0

感謝您的回覆,是的,我需要一些細節,只是讓我更好地瞭解該怎麼做 –

0

你的方法,BankMainPart2.loginCard沒有「cardNum」的上下文,它不知道它是什麼(類型或值)。

爲了使該方法能夠採取行動數組列表上,你必須通過一個參考吧,有點像......

public class BankMainPart2 { 
    public static void loginCard(ArrayList<Integer> cardNum){ 
     if (cardNum.contains(name)) { 
     } 
    } 
} 
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()); 
     } 
} 

但當cardnum中的ArrayList中BankMain類是上面的場景只會工作,要麼顯着的公共,保護或默認(Nomodifier) 。它wouldnt工作,如果其標記爲私營等非訪問修飾符,如靜態和最終

0

您可以嘗試以下

1.Declare中的任何一個ArrayList的公共然後導入第一類和使用cardnum中的第二類

2.Make的cardnum中的靜態VAR和直接在第二類使用它作爲BankMain.cardNum

3.Pass該ArrayList作爲參數到所述第二類。

0

關鍵問題在於您嘗試創建類的方式。您當前的問題可以通過@MadProgrammer給出的答案來解決。但是你應該明確地看看面向對象的編程概念。這部分在How to identify and design a Class?應該給你一些清晰的指針。

相關問題