2015-12-13 98 views
0

剛剛瞭解到調用方法和想法我會嘗試一下,但我的代碼無法正常工作。它應該採取2個名字和打印。就這樣。我的變量是全局的,所以我所有的方法都應該能夠看到它們,但是當程序運行時它會打印出'null'。有人可以解釋爲什麼這不起作用嗎?這與傳遞變量有關嗎?我想如果這是全球性的,我不需要這樣做?調用方法/變量範圍

import java.util.Scanner; 
public class UserID { 

String firstName; 
String secondName; 

public void readNames(){ 
    Scanner scan = new Scanner(System.in); 

    System.out.print("Enter first name: "); 
    firstName = scan.nextLine(); 

    System.out.print("Enter second name: "); 
    secondName = scan.nextLine(); 

    scan.close(); 
} 



public void printID(){ 

    System.out.println("Your user ID is: " + firstName); 

} 

public static void main(String[] args) { 

    UserID readNames = new UserID(); 

    UserID printID = new UserID(); 


    readNames.readNames(); 

    printID.printID(); 


} 

}

+2

爲什麼要創建同一個類的兩個對象?一旦你找出這個問題,你應該能夠弄清楚它 – 3kings

+1

Java中沒有這樣的全局變量。 – chrylis

回答

0

的原因是,您從「用戶名」類的一個實例調用read方法,然後試圖從另一名稱。每創建一個實例,每次創建新實例時,都會創建一組新數據。如果您要交換'printID.printID();',這可能會變得更加清晰。到'readNames.printID();'

至於修復,您應該嘗試創建只有一個實例,然後調用該實例上的兩個方法。

0

問題是你正在創建類UserID的兩個對象。 在readName對象中,您正在更改firstName和secondName變量,但在printID對象中它們仍然爲null。這是因爲非靜態變量與不是類的對象相關聯。所以當你在printID對象中打印變量時,它會打印出null。正如在前面的答案中,您可以將printID與readName交換。

readNames.printID(); 

或者你可以通過使它們變爲靜態而使對象與類而不是對象相關聯。然後,爲所有創建firtName和secondName的對象將是常見的。

static String firstName; 
static String secondName; 
0

更改您的代碼如下

readNames.readNames(); 
    readNames.printID(); 

    printID.readNames(); 
    printID.printID(); 

以下變量是instance variables,他們在你創建的對象的範圍存在。

String firstName; 
String secondName; 

在您的代碼中,您初始化了readNames對象上的變量。因此,要打印這些變量的值,您必須在該實例上調用printID()方法。而不是在readNames實例上調用printID()方法,而是調用printID對象實例上的方法。但是printID實例沒有設置變量,並且您得到Null作爲該實例的默認值。

如果您使用與readNames() & printID()相同的對象,則會得到正確的輸出。

還有一件事:有很好的命名約定,不要對對象和方法使用相同的名稱。