调用方法/变量范围

时间:2015-12-13 03:20:29

标签: java

刚学会了调用方法和思想我会尝试一下,但我的代码无法正常运行。它应该采取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();


}

}

3 个答案:

答案 0 :(得分:0)

原因是您从“UserID”类的一个实例调用read方法,然后尝试从另一个实例中检索名称。您创建的每个实例(每次执行新实例时)都会创建一组新数据。如果你要交换'printID.printID();',这可能会变得更加清晰。 'readNames.printID();'

至于修复,您应该尝试只创建一个实例,然后在该实例上调用两个方法。

答案 1 :(得分:0)

问题是您正在创建UserID类的两个对象。 在readName对象中,您正在更改firstName和secondName变量,但在printID对象中它们仍为null。这是因为非静态变量与不是类的对象相关联。因此,当您在printID对象中打印变量时,它会输出null。与上一个答案一样,您可以使用readName交换printID。

readNames.printID();

或者您可以通过将变量设置为静态来使变量与类而不是对象相关联。然后,对于您创建的所有对象,firtName和secondName将是常见的。

static String firstName;
static String secondName;

答案 2 :(得分:0)

更改您的代码如下

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

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

下面的变量是instance variables,它们存在于您创建它的对象范围内。

String firstName;
String secondName;

在您的代码中,您初始化了readNames对象上的变量。因此,要打印这些变量的值,您必须在该实例上调用printID()方法。您没有在printID()实例上调用readNames方法,而是在printID对象实例上调用了该方法。但printID实例未设置变量,并且您将Null作为该实例的默认值。

如果您使用readNames()&的同一个对象,您将获得正确的输出printID()

还有一件事:拥有良好的命名约定,不要对对象和方法使用相同的名称。